我很好奇是什么限制必须让设计决定不让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更多地支持它?
由于
答案 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幕后但我不确定。