代码之家  ›  专栏  ›  技术社区  ›  DigitalZebra

我可以把这个.NET foreach循环写得更短吗?

  •  0
  • DigitalZebra  · 技术社区  · 15 年前

    我觉得写这个的方法要短一些 foreach 循环,创建 SortedDictionary<string, object> . 注意 object 只是一个位置保持器,我真的在使用其他引用类型。谢谢!

    代码如下:

    foreach (KeyValuePair<string, object> entry in sortedDictionary)
    {
        this.mSortedDictionary.Add(entry.Key, new object());
    }
    
    5 回复  |  直到 15 年前
        1
  •  5
  •   Henri    15 年前

    重点是,这是非常短的。

    对于记录,您可以为执行此操作的dictionary(或idictionary)创建一个扩展方法。从那时起,您可以对任何dictionary调用扩展方法。

        2
  •  4
  •   STO    15 年前
    mSortedDictionary = sortedDictionary.ToDictionary(kvp => kvp.Key, kvp => new Object());
    
        3
  •  2
  •   Jörg W Mittag    15 年前

    编程经验法则之一:在每一个循环中,都有一个变形(也称为 fold , reduce , inject:into: inject )等着出去。这里也是这样。谢天谢地,Linq的一个操作符为我们提供了变形,微软称之为 Aggregate :

    sortedDictionary.Aggregate(mSortedDictionary, (d, e) => {
        d.Add(e.Key, Transform(e.Value)); return d; });
    

    注意:这可以通过使用k组合器和析构函数绑定进一步简化。不幸的是,我在BCL中找不到K组合器,尽管我很确定 去某个地方。(如果有人知道,请告诉我。)

    在这个例子中,我将提供我自己的k组合器,并将其称为 Tap 除了这一点,在Ruby中它被称为:

    public static T Tap<T>(this T o, Action<T> f) { f(o); return o; }
    

    这就是一切。(好吧,至少如果忽略线程安全和异常…)

    利用K组合器,我们得出:

    sortedDictionary.Aggregate(mSortedDictionary, (d, e) => d.Tap(dd =>
        dd.Add(e.Key, Transform(e.Value))));
    

    这对眼睛来说容易多了。

    不幸的是,我们不能添加破坏绑定,但是如果C# 支持销毁绑定,看起来更像这样:

    sortedDictionary.Aggregate(mSortedDictionary, (d, {k, v}) => d.Tap(dd =>
        dd.Add(k, Transform(v))));
    

    [注意:在这个示例中,我使用对象初始值设定项语法来破坏绑定。]

    例如,在Ruby中, 同时具有析构函数绑定和k组合器,如下所示:

    sorted_dictionary.reduce(m_sorted_dictionary) {|d, (k, v)|
      d.tap {|d| d[k] = transform(v) }
    }
    
        4
  •  1
  •   David    15 年前

    抓住无实体伞扩展库( http://umbrella.codeplex.com ):

    sortedDictionary.ForEach(s => mSortedDictionary.Add(s, new object()));
    
        5
  •  -2
  •   PjL    15 年前
    foreach( string key in sortedDictionary.Keys ) {
       mSortedDictionary.Add(key, new object());
    }