一個編程的經驗法則:在所有其他循環,有一個catamorphism(也稱爲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 combinator,雖然我很確定有在那裏。 (如果有人知道,請告訴我。)
對於這個例子的目的,我將提供我自己的K combinator,我打算將它稱爲Tap
除了這就是它的名稱紅寶石:
public static T Tap<T>(this T o, Action<T> f) { f(o); return o; }
這就是字面上所有的東西。 (嗯,至少,如果你忽視線程安全和異常&hellip;)
使用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) }
}
嗯,我想你可以寫0行而不是1,但這可能不會有太大的幫助... – 2010-06-23 19:33:08
比一行還短嗎?你在擔心錯誤的事情。 – 2010-06-23 19:33:43
你可以改變你的變量名爲'a','b'等,並保存幾個字符 - 並不意味着你應該。你在做什麼?性能 - for循環比foreach快,但是失去了在枚舉器上運行的事務性方面 – STW 2010-06-23 19:37:06