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没有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在幕后,但我不确定。