Dictionary .NET:ForEach()扩展方法和字典

Dictionary .NET:ForEach()扩展方法和字典,dictionary,foreach,Dictionary,Foreach,我有一个简单的问题:我对Dictionary.Value集合和in进行了大量迭代,我不得不调用.ToList()才能调用.ForEach(),因为字典中的可枚举集合(字典本身、键集合或值集合)似乎都没有ForEach扩展方法 这些集合上没有实现ForEach()扩展方法有什么好的原因吗?或者这只是MS觉得不重要的东西 对字典集合进行迭代有那么不寻常吗?在存储从数据库中取出的数据时,我经常使用字典而不是列表,使用记录标识值作为键。我不得不承认,很多时候我甚至不按Id键进行查找,但这只是我养成的一个

我有一个简单的问题:我对Dictionary.Value集合和in进行了大量迭代,我不得不调用.ToList()才能调用.ForEach(),因为字典中的可枚举集合(字典本身、键集合或值集合)似乎都没有ForEach扩展方法

这些集合上没有实现ForEach()扩展方法有什么好的原因吗?或者这只是MS觉得不重要的东西

对字典集合进行迭代有那么不寻常吗?在存储从数据库中取出的数据时,我经常使用字典而不是列表,使用记录标识值作为键。我不得不承认,很多时候我甚至不按Id键进行查找,但这只是我养成的一个习惯…

没有理由(IMO)不在IEnumerable上实现ForEach扩展方法(相反,它只在列表中)。我在我的公共库中创建了一个ForEach扩展方法,它只需要几行代码

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可以有两个论点,一个用于键,一个用于值,这将使代码看起来更干净。