我认为编写此foreach
循环的方法较短,可创建SortedDictionary<string, object>
的深层副本。请注意,object
只是一个占位符,我真的在那里使用其他一些引用类型。谢谢!
以下是代码:
foreach (KeyValuePair<string, object> entry in sortedDictionary)
{
this.mSortedDictionary.Add(entry.Key, new object());
}
答案 0 :(得分:5)
重点是,这完全是短暂的。
对于记录,您可以为Dictioary(或IDictioary)制作一个扩展方法来执行此操作。从那时起,您可以在任何词典上调用扩展方法。
答案 1 :(得分:4)
mSortedDictionary = sortedDictionary.ToDictionary(kvp => kvp.Key, kvp => new Object());
答案 2 :(得分:2)
编程的一个经验法则:在每个其他循环中,有一个等变量(也称为fold
,reduce
,inject: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());
}