Для LINQ ForEach на HashSet? - PullRequest
       11

Для LINQ ForEach на HashSet?

3 голосов
/ 02 ноября 2011

Мне любопытно, какие ограничения привели к тому, что проектное решение не позволяло HashSet использовать запрос ForQach LINQ.

Что на самом деле происходит за кулисами для этих двух реализаций:

var myHashSet = new HashSet<T>;
foreach( var item in myHashSet ) { do.Stuff(); }

против

var myHashSet = new HashSet<T>;
myHashSet.ForEach( item => do.Stuff(); }

Я (довольно) уверен, что это только потому, что HashSet не реализует IEnumerable - но то, что обычный цикл ForEach делает по-другому, что делает его более поддерживаемым HashSet?

Спасибо

Ответы [ 4 ]

7 голосов
/ 02 ноября 2011

LINQ не имеет ForEach. Только класс List<T> имеет метод ForEach.

Также важно отметить, что HashSet осуществляет реализацию IEnumerable<T>.

Помните, LINQ означает Language Integrated Query. Он предназначен для запроса коллекций данных. ForEach не имеет ничего общего с запросами. Это просто перебирает данные. Поэтому он действительно не принадлежит LINQ.

4 голосов
/ 02 ноября 2011

LINQ предназначен для запроса данных, я предполагаю, что этого избегали ForEach(), потому что есть вероятность, что он может изменить данные, что повлияет на способ запроса данных (т. Е. Если вы изменили поле, которое влияло на хеш-код или равенство).

Вы можете быть смущены тем фактом, что List<T> имеет ForEach()?

Конечно, достаточно легко написать один, но его следует использовать с осторожностью из-за вышеупомянутых проблем ...

public static class EnumerableExtensions
{
    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");

        foreach(var item in source)
        {
            action(item);
        }
    }
}
3 голосов
/ 29 августа 2014
var myHashSet = new HashSet<T>;
myHashSet.ToList().ForEach( x => x.Stuff() );
0 голосов
/ 02 ноября 2011

Первое использование метода GetEnumerator из HashSet Второй метод ForEach

Возможно, второе использование GetEnumerator за сценой, но я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...