2011-04-20 47 views
3

我有一個方法,我不滿意,請你告訴我如何更好地做到這一點。什麼是一個優雅的方式來轉換IDictionary <字符串,對象>爲IDictionary <字符串,字符串>

public Foo WithBar(IDictionary<string, object> parameters) { 
    var strStrDict = new Dictionary<string, string>(parameters.Count); 
    foreach(var pair in parameters) 
    { 
     strStrDict.Add(pair.Key, pair.Value != null ? pair.Value.ToString() : (string)null); 
    }  
    // Call overload which takes IDictionary<string, string> 
    return this.WithBar(strStrDict); 
} 

此代碼的工作原理,但我相信有一個很好的linq'y這樣做,我失蹤的方式。

+2

你應該對你的方法不滿意的一個原因:它已經壞了! 'pair.Value == null? pair.Value.ToString():(string)null'應該很好地爆炸。 – 2011-04-20 21:21:27

+0

謝謝安東尼,我問了這個問題,然後去寫單元測試。所以剛剛發現。 – 2011-04-20 21:25:52

+0

謝謝大家的快速很好的答案。 – 2011-04-20 21:38:23

回答

7
parameters.ToDictionary(k=>k.Key, v=>v.Value!=null?v.Value.ToString():(string)null); 
+1

該構造稱爲'as';) – Dykam 2011-04-20 21:21:16

+2

@dykam,絕對不是。 'as'執行引用轉換,如果對象不是字符串,則將返回null。 'ToString'返回對象的字符串表示,這是完全不同的...... – 2011-04-20 21:25:36

+3

從技術上講,不需要'(string)null'。在表達條件? obj.ToString():null;'編譯器有足夠的信息來確定表達式的類型是一個字符串。 – 2011-04-20 21:27:54

-1
parameters.ToDictionary(p => p.Key, p => p.Value.ToString()) // out of my head 
+0

您將在空值上發生異常。 – 2011-04-20 21:21:11

4
parameters.ToDictionary(k => k.Key, v => Convert.ToString(v.Value)) 

Convert.ToString()回報null上你所期望的空值。

更新:

Convert.ToString(object)回報String.EmptyConvert.ToString(string)回報null。不幸的是,這是而不是你需要什麼。在我看來奇怪的定義: -/

+3

Convert.ToString(null)return String.Empty http://msdn.microsoft.com/en-us/library/astxcyeh.aspx,並失敗我的單元測試:) – 2011-04-20 21:33:19

+0

有趣的轉折。在LinqPad中(即將在VS中測試),'Convert.ToString(null)'返回null,但是'object obj = null; Convert.ToString(obj)'返回空字符串。 – 2011-04-20 21:38:23

+0

@David Waters我看到:)我顯然測試了錯誤的'Convert.ToString'(請參閱更新後的答案)。 @Anthony Pegram是的,它需要最「混凝土」的超載。 – 2011-04-20 21:42:15

相關問題