.NET: методы расширения ForEach () и словарь - PullRequest
2 голосов
/ 26 августа 2009

У меня есть быстрый вопрос: я делаю много итераций коллекций Dictionary.Value и раздражает меня тем, что мне приходится вызывать .ToList (), чтобы потом иметь возможность вызывать .ForEach (), так как кажется, что ни один из перечислимых коллекции в словаре (сам словарь, коллекция ключей или коллекция значений) имеют метод расширения ForEach.

Есть ли веская причина, по которой метод расширения ForEach () не был реализован в этих коллекциях, или это просто то, что, по мнению MS, было не важно?

Необычно ли перебирать коллекции словаря? Я часто использую словари, а не списки при хранении данных, извлеченных из баз данных, используя значение Identity для записей в качестве ключа. Я должен признать, что часто даже не ищу ключ Id, но это просто привычка, в которую я попал ...

Ответы [ 3 ]

8 голосов
/ 26 августа 2009

Эрик Липперт объясняет, почему Microsoft не написала ForEach метод расширения .

Вы можете написать один самостоятельно:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) {
    if (sequence == null) throw new ArgumentNullException("sequence");
    if (action == null) throw new ArgumentNullException("action");
    foreach(T item in sequence) 
        action(item);
}

//Return false to stop the loop
public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action) {
    if (sequence == null) throw new ArgumentNullException("sequence");
    if (action == null) throw new ArgumentNullException("action");

    foreach(T item in sequence) 
        if (!action(item))
            return;
}
2 голосов
/ 09 июля 2014

Хм, давайте обновим мой комментарий до ответа, чтобы я мог включить читаемый код.

Эрик дает хороший аргумент против общего ForEach на IEnumerable<>, но для Dictionary<> это все равно будет выгодно, потому что простой цикл foreach дает вам KeyValuePair, но лямбда может иметь два аргументы, один для ключа и один для значения, которые сделали бы код более чистым.

public static void ForEach<TKey, TValue>(this Dictionary<TKey, TValue> dict, Action<TKey, TValue> action) {
    if (dict == null) throw new ArgumentNullException("dict");
    if (action == null) throw new ArgumentNullException("action");

    foreach (KeyValuePair<TKey, TValue> item in dict) {
        action(item.Key, item.Value);
    }
}
1 голос
/ 26 августа 2009

Нет веских причин (IMO), чтобы не было метода расширения ForEach, реализованного в IEnumerable (вместо этого он используется только в List ). Я создал метод расширения ForEach в моих общих библиотеках, это всего лишь несколько строк кода.

public static void ForEach<T>( this IEnumerable<T> list, Action<T> action ) {
    foreach( var o in list ) {
        action( o );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...