【问题标题】:.NET: ForEach() extension methods and Dictionary.NET:ForEach() 扩展方法和字典
【发布时间】:2009-08-26 01:36:40
【问题描述】:

我有一个简单的问题:我对 Dictionary.Value 集合做了很多迭代,让我很恼火的是我必须调用 .ToList() 才能调用 .ForEach(),因为它似乎没有可枚举的Dictionary 中的集合(Dictionary 本身、Keys 集合或 Values 集合)具有 ForEach 扩展方法。

ForEach() 扩展方法没有在这些集合上实现,或者只是 MS 认为不重要的东西,有什么好的理由吗?

遍历 Dictionary 集合有那么不寻常吗?在存储从数据库中提取的数据时,我经常使用字典而不是列表,使用记录标识值作为键。我不得不承认很多时候我什至不通过 Id 键查找,但这只是我养成的习惯......

【问题讨论】:

  • 你为什么不自己写一个扩展?

标签: dictionary foreach


【解决方案1】:

Eric Lippert explains why Microsoft didn't write a ForEach extension method.

你可以自己写一个:

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;
}

【讨论】:

  • Eric 的文章提出了一些要点。我希望人们在使用您的答案变得疯狂之前先阅读一下。
  • Eric 对IEnumerable&lt;&gt; 上的一般ForEach 提出了很好的论据,但对于Dictionary&lt;&gt; 它仍然是有利的,因为普通的foreach 循环给你一个KeyValuePair,但是一个 lambda 可以有两个参数,一个是键,一个是值,这会使代码看起来更简洁。
  • 链接已过期。这是新链接:ericlippert.com/2009/05/18/foreach-vs-foreach 他基本上说你应该只为每个循环使用原始链接,因为它更基本。
【解决方案2】:

嗯,让我们将我的评论升级为答案,这样我就可以包含可读的代码。

Eric 对IEnumerable&lt;&gt; 上的一般ForEach 提出了很好的论据,但对于Dictionary&lt;&gt; 它仍然是有利的,因为普通的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);
    }
}

【讨论】:

    【解决方案3】:

    没有充分的理由 (IMO) 没有在 IEnumerable 上实现 ForEach 扩展方法(而是仅在 List 上实现)。我在我的常用库中创建了一个 ForEach 扩展方法,它只有几行代码。

    public static void ForEach<T>( this IEnumerable<T> list, Action<T> action ) {
        foreach( var o in list ) {
            action( o );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多