LINQ's ForEach on HashSet?

本文关键字:on HashSet ForEach LINQ | 更新日期: 2023-09-27 18:13:32

我很好奇是什么限制使得设计决策不允许HashSet使用LINQ的ForEach查询。

这两种实现背后的真正不同之处是什么?

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?

谢谢

LINQ's ForEach on HashSet?

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

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

记住,LINQ代表语言集成查询。它用于查询数据集合。ForEach与查询无关。它只是循环遍历数据。因此,它真的不属于LINQ。

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);
        }
    }
}
var myHashSet = new HashSet<T>;
myHashSet.ToList().ForEach( x => x.Stuff() );

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

方法

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