LINQ在HashSet上的ForEach?

时间:2011-11-02 16:32:56

标签: c# linq hashset

我很好奇是什么限制必须让设计决定不让HashSet能够使用LINQ的ForEach查询。

这两种实现的幕后实际情况有何不同:

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

vs

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

我(非常)确定这只是因为HashSet没有实现IEnumerable - 但是正常的ForEach循环做什么不同会使HashSet更多地支持它?

由于

4 个答案:

答案 0 :(得分:7)

LINQ没有ForEach。只有List<T>类具有ForEach方法。

同样重要的是要注意HashSet 实施IEnumerable<T>

请记住,LINQ代表Language INtegrated Query。它用于查询数据集合。 ForEach与查询无关。它只是循环数据。因此它确实不属于LINQ。

答案 1 :(得分:4)

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);
        }
    }
}

答案 2 :(得分:3)

var myHashSet = new HashSet<T>;
myHashSet.ToList().ForEach( x => x.Stuff() );

答案 3 :(得分:-1)

首先使用HashSet的方法GetEnumerator 第二个方法ForEach

也许第二次使用GetEnumerator幕后但我不确定。