Dictionary .NET:ForEach()扩展方法和字典
我有一个简单的问题:我对Dictionary.Value集合和in进行了大量迭代,我不得不调用.ToList()才能调用.ForEach(),因为字典中的可枚举集合(字典本身、键集合或值集合)似乎都没有ForEach扩展方法 这些集合上没有实现ForEach()扩展方法有什么好的原因吗?或者这只是MS觉得不重要的东西 对字典集合进行迭代有那么不寻常吗?在存储从数据库中取出的数据时,我经常使用字典而不是列表,使用记录标识值作为键。我不得不承认,很多时候我甚至不按Id键进行查找,但这只是我养成的一个习惯…没有理由(IMO)不在IEnumerable上实现ForEach扩展方法(相反,它只在列表中)。我在我的公共库中创建了一个ForEach扩展方法,它只需要几行代码Dictionary .NET:ForEach()扩展方法和字典,dictionary,foreach,Dictionary,Foreach,我有一个简单的问题:我对Dictionary.Value集合和in进行了大量迭代,我不得不调用.ToList()才能调用.ForEach(),因为字典中的可枚举集合(字典本身、键集合或值集合)似乎都没有ForEach扩展方法 这些集合上没有实现ForEach()扩展方法有什么好的原因吗?或者这只是MS觉得不重要的东西 对字典集合进行迭代有那么不寻常吗?在存储从数据库中取出的数据时,我经常使用字典而不是列表,使用记录标识值作为键。我不得不承认,很多时候我甚至不按Id键进行查找,但这只是我养成的一个
public static void ForEach<T>( this IEnumerable<T> list, Action<T> action ) {
foreach( var o in list ) {
action( o );
}
}
publicstaticvoidforeach(此IEnumerable列表,操作){
foreach(列表中的var o){
行动(o);
}
}
你可以自己写一个:
public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) {
if (sequence == null) throw new ArgumentNullException("sequence");
if (action == null) throw new ArgumentNullException("action");
foreach(T item in sequence)
action(item);
}
//Return false to stop the loop
public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action) {
if (sequence == null) throw new ArgumentNullException("sequence");
if (action == null) throw new ArgumentNullException("action");
foreach(T item in sequence)
if (!action(item))
return;
}
publicstaticvoidforeach(这个IEnumerable序列,动作){
如果(sequence==null)抛出新的ArgumentNullException(“sequence”);
如果(action==null)抛出新的ArgumentNullException(“action”);
foreach(按顺序排列的T项)
行动(项目);
}
//返回false以停止循环
公共静态void ForEach(此IEnumerable序列,Func操作){
如果(sequence==null)抛出新的ArgumentNullException(“sequence”);
如果(action==null)抛出新的ArgumentNullException(“action”);
foreach(按顺序排列的T项)
如果(!行动(项目))
返回;
}
嗯,让我们将我的评论升级为答案,这样我就可以包含可读的代码
Eric对
IEnumerable
上的常规ForEach
提出了一个很好的论点,但对于字典来说,它仍然是有利的,因为普通ForEach
循环会给你一个KeyValuePair
,但是lambda可以有两个参数,一个用于键,一个用于值,这将使代码看起来更干净
public static void ForEach<TKey, TValue>(this Dictionary<TKey, TValue> dict, Action<TKey, TValue> action) {
if (dict == null) throw new ArgumentNullException("dict");
if (action == null) throw new ArgumentNullException("action");
foreach (KeyValuePair<TKey, TValue> item in dict) {
action(item.Key, item.Value);
}
}
publicstaticvoidforeach(这个字典的命令,动作){
如果(dict==null)抛出新的ArgumentNullException(“dict”);
如果(action==null)抛出新的ArgumentNullException(“action”);
foreach(dict中的KeyValuePair项){
动作(项.键,项.值);
}
}
为什么不自己编写一个扩展呢?Eric的文章提出了一些很好的观点。我希望人们在用你的答案发疯之前读到这一点。Eric在IEnumerable
上对一般的ForEach
提出了一个很好的论点,但对于Dictionary
它仍然是有利的,因为普通的ForEach
循环给你一个KeyValuePair
,但lambda可以有两个论点,一个用于键,一个用于值,这将使代码看起来更干净。