Во-первых, нет способа расширения ForEach
для Dictionary
или даже IEnumerable
.Так что вам придется сначала решить эту проблему.
Во-вторых, метод расширения Last
будет мучительно медленным , поскольку он должен перечислять всю коллекцию.
В-третьих, я не уверен, что он делает многоимеет смысл сделать что-то особенное для последнего элемента из коллекции с непредсказуемым порядком, но это в основном касается вашего конкретного вопроса.
Вот как я бы подошел к проблеме.Создайте два новых метода расширений, которые работают с IEnumerable<T>
экземплярами.ForEach
будет эквивалентен методу List<T>.ForEach
, а WithIndex
вернет другой перечислитель, который содержит последовательный индекс и флаг IsLast
.Это вариант другого моего ответа на похожую проблему.
dictionary.WithIndex().ForEach(
(item) =>
{
var kvp = item.Value; // This extracts the KeyValuePair
if (item.IsLast)
{
Console.WriteLine("Key=" + kvp.Key.ToString() + "; Value=" + kvp.Value.ToString());
}
});
Вот новые методы расширения.
public static class ForEachHelperExtensions
{
public sealed class Item<T>
{
public int Index { get; set; }
public T Value { get; set; }
public bool IsLast { get; set; }
}
public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
foreach (T item in enumerable)
{
action(item);
}
}
public static IEnumerable<Item<T>> WithIndex<T>(this IEnumerable<T> enumerable)
{
Item<T> item = null;
foreach (T value in enumerable)
{
Item<T> next = new Item<T>();
next.Index = 0;
next.Value = value;
next.IsLast = false;
if (item != null)
{
next.Index = item.Index + 1;
yield return item;
}
item = next;
}
if (item != null)
{
item.IsLast = true;
yield return item;
}
}
}