@ শিমির প্রতিক্রিয়াটির ভিত্তিতে, আমি একটি এক্সটেনশন পদ্ধতি তৈরি করেছি যা এটিই সমাধানের সমাধান যা প্রত্যেকে চায়। এটি সহজ, ব্যবহার করা সহজ এবং একবারে সংগ্রহের মধ্য দিয়ে কেবল লুপ হয়।
internal static class EnumerableExtensions
{
public static void ForEachLast<T>(this IEnumerable<T> collection, Action<T>? actionExceptLast = null, Action<T>? actionOnLast = null)
{
using var enumerator = collection.GetEnumerator();
var isNotLast = enumerator.MoveNext();
while (isNotLast)
{
var current = enumerator.Current;
isNotLast = enumerator.MoveNext();
var action = isNotLast ? actionExceptLast : actionOnLast;
action?.Invoke(current);
}
}
}
এটি যে কোনও কাজ করে IEnumerable<T>
। ব্যবহার এর মতো দেখাচ্ছে:
var items = new[] {1, 2, 3, 4, 5};
items.ForEachLast(i => Console.WriteLine($"{i},"), i => Console.WriteLine(i));
আউটপুট দেখে মনে হচ্ছে:
1,
2,
3,
4,
5
অতিরিক্তভাবে, আপনি এটি Select
স্টাইল পদ্ধতিতে তৈরি করতে পারেন । তারপরে, সেই এক্সটেনশানটিকে পুনরায় ব্যবহার করুন ForEach
। কোডটি এর মতো দেখাচ্ছে:
internal static class EnumerableExtensions
{
public static void ForEachLast<T>(this IEnumerable<T> collection, Action<T>? actionExceptLast = null, Action<T>? actionOnLast = null) =>
// ReSharper disable once IteratorMethodResultIsIgnored
collection.SelectLast(i => { actionExceptLast?.Invoke(i); return true; }, i => { actionOnLast?.Invoke(i); return true; }).ToArray();
public static IEnumerable<TResult> SelectLast<T, TResult>(this IEnumerable<T> collection, Func<T, TResult>? selectorExceptLast = null, Func<T, TResult>? selectorOnLast = null)
{
using var enumerator = collection.GetEnumerator();
var isNotLast = enumerator.MoveNext();
while (isNotLast)
{
var current = enumerator.Current;
isNotLast = enumerator.MoveNext();
var selector = isNotLast ? selectorExceptLast : selectorOnLast;
//https://stackoverflow.com/a/32580613/294804
if (selector != null)
{
yield return selector.Invoke(current);
}
}
}
}