2010-06-23 67 views
0

我認爲寫這個foreach循環有一個較短的方法,創建一個SortedDictionary<string, object>的深層副本。請注意,object只是一個佔位符,我真的在那裏使用其他的引用類型。謝謝!我可以寫這個.NET的foreach循環嗎?

下面是代碼:

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

嗯,我想你可以寫0行而不是1,但這可能不會有太大的幫助... – 2010-06-23 19:33:08

+3

比一行還短嗎?你在擔心錯誤的事情。 – 2010-06-23 19:33:43

+0

你可以改變你的變量名爲'a','b'等,並保存幾個字符 - 並不意味着你應該。你在做什麼?性能 - for循環比foreach快,但是失去了在枚舉器上運行的事務性方面 – STW 2010-06-23 19:37:06

回答

5

請告訴我點,這是完全短。

爲了記錄,你可以爲Dictioary(或IDictioary)做一個擴展方法來做到這一點。從那以後,你可以在任何一個dictioary上調用擴展方法。

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

...這是不相同的,原始代碼可能會添加項目到現有的字典... – Lucero 2010-06-23 19:36:39

+0

請不要.. lambdas只是讓別人的工作更難的時候,他們必須在兩個月後讀取您的代碼; - ) – PjL 2010-06-23 19:37:09

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

OP聲明'new object()'行只是一個佔位符,大概是對於原始字典引用的對象的深層副本。枚舉鍵不能解決問題。 – drharris 2010-06-23 19:49:17

+0

當然它確實如:mSortedDictionary.Add(key,sortedDictionary [key] .Clone()); ..但「推測」表示您對問題的解釋。 – PjL 2010-06-28 10:32:48

2

一個編程的經驗法則:在所有其他循環,有一個catamorphism(也稱爲foldreduceinject: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

哇...我有很多東西要學。 – 2010-06-23 22:53:32

+0

那真棒。 :D – 2010-06-23 23:59:27

相關問題