LINQ在HashSet上的ForEach?

Sea*_*son 3 c# linq hashset

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

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

var myHashSet = new HashSet<T>;
foreach( var item in myHashSet ) { do.Stuff(); }
Run Code Online (Sandbox Code Playgroud)

VS

var myHashSet = new HashSet<T>;
myHashSet.ForEach( item => do.Stuff(); }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jus*_*ner 7

LINQ没有ForEach.只有List<T>班级有一个ForEach方法.

值得注意的是,HashSet 确实可以实现IEnumerable<T>.

请记住,LINQ代表语言集成查询.它用于查询数据集合.ForEach与查询无关.它只是循环数据.因此它确实不属于LINQ.


Jam*_*are 6

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)