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

时间:2010-06-23 19:30:23

标签: c# .net

我认为编写此foreach循环的方法较短,可创建SortedDictionary<string, object>的深层副本。请注意,object只是一个占位符,我真的在那里使用其他一些引用类型。谢谢!

以下是代码:

foreach (KeyValuePair<string, object> entry in sortedDictionary)
{
    this.mSortedDictionary.Add(entry.Key, new object());
}

5 个答案:

答案 0 :(得分:5)

重点是,这完全是短暂的。

对于记录,您可以为Dictioary(或IDictioary)制作一个扩展方法来执行此操作。从那时起,您可以在任何词典上调用扩展方法。

答案 1 :(得分:4)

mSortedDictionary = sortedDictionary.ToDictionary(kvp => kvp.Key, kvp => new Object());

答案 2 :(得分:2)

编程的一个经验法则:在每个其他循环中,有一个等变量(也称为foldreduceinject:into:inject)出去。这也是这种情况。值得庆幸的是,其中一个LINQ运算符为我们提供了一个catamorphism,微软称之为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))));

[注意:在这个例子中,我使用对象初始化器语法来解构bind。]

例如,在Ruby中, 同时具有解构绑定和K组合器,它看起来像这样:

sorted_dictionary.reduce(m_sorted_dictionary) {|d, (k, v)|
  d.tap {|d| d[k] = transform(v) }
}

答案 3 :(得分:1)

抓住nVentive Umbrella Extensions图书馆(http://umbrella.codeplex.com)并:

sortedDictionary.ForEach(s => mSortedDictionary.Add(s, new object()));

答案 4 :(得分:-2)

foreach( string key in sortedDictionary.Keys ) {
   mSortedDictionary.Add(key, new object());
}