2012-08-23 49 views
2

我試圖將字典作爲參數發送給方法。它有效,但它有點乏味。我做了一百萬次,如果可能的話,我想盡量做一點點的修飾。眼下,這是它的外觀:簡化建築詞典

MyMethod(new Dictionary<string, object> { { string1, value1 }, { string2, value2 } }); 

我想獲得它看起來更像是這樣的:

MyMethod({ string1, value1 }, { string2, value2 }); 

這是一個白日夢?任何想法如何做到這一點?

+0

我認爲不可能,但我不知道 –

+2

只是將它分成多行,或者添加新行 – Servy

+0

爲什麼你要創造一百萬字典呢?你是單元測試嗎? –

回答

4

我不不要以爲有什麼方法可以獲得你正在尋找的語法類型。我能想到的最接近,和最短的事情是定義是這樣的:

using D = System.Collections.Generic.Dictionary<string, object>; 

然後你可以這樣做:

MyMethod(new D {{string1, value1},{string2, value2}}); 

這是一個有點短,但可能仍不理想。

+5

雖然這對你的團隊成員來說有點意思。給它至少一個單詞的名字,而不是一個字母的名字。 – Servy

+1

@Servy,是漂亮的意思。我只是爲了最大限度的簡潔。 – Eric

+0

所有好的答案,但我會「接受」這一個。但是我修改了它,使它成爲一個擴展Dictionary 的類,然而,我把它稱爲「Params」,因爲它就是這樣。 – vbullinger

2

這幾乎是一個夢想。您可以創建一個通用DictionaryBuilder類,包含通用DictionaryBuilder.Start方法的非通用類,所以你可以寫:

MyMethod(DictionaryBuilder.Start(string1, value1).Add(string2, value2).Build()); 

...但是,要麼是不完全好的。

要爲新對象(而不是嵌入式初始化程序)使用集合初始值設定項,必須有來調用構造函數,這意味着指定類型參數。

+0

這是我的想法之一。不過,我想知道它是否會變得更緊張? – vbullinger

+0

@vbullinger:我不這麼認爲,沒有像埃裏克這樣的黑客,這些都不是很好。 –

2

我不知道要做什麼你正在尋找,但你可以作弊一點,並使用可變參數列表。你失去了一些類型檢查,如果你不把它完全正確,你會得到一個例外,但它不太羅嗦:

void MyMethod(params object[] arr) { 
    var d = new Dictionary<string,object>(); 
    for(int i=0; i<arr.Length; i+=2) { 
     d.Add((string)arr[i], arr[i+1]); 
    } 
} 

用法示例:

MyMethod(string1, value1, string2, value2); 
+2

可能會打開一罐蠕蟲雖然 –

+0

我也有這個想法,我也有AD.Net的想法:)我不知道這是否可以稍微好一點? – vbullinger

1

如果你堅持把你的方法輸入縮短到極限,我就和Ethan Brown一樣思考。這是一個使用params來輸入字典元素的小程序。

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyMethod("Key1", 1, "Key2", 2, "Key3", 3); 
    } 

    static void MyMethod(params object[] alternatingKeysValues) 
    { 
     var dictionary = AlternatingKeysValuesToDictionary(alternatingKeysValues); 
     // etc... 
    } 

    static Dictionary<string, object> AlternatingKeysValuesToDictionary(params object[] alternatingKeysValues) 
    { 
     if (alternatingKeysValues.Count() % 2 == 1) 
      throw new ArgumentException("AlternatingKeysValues must contain an even number of items."); 
     return Enumerable 
      .Range(1, alternatingKeysValues.Count()/2) 
      .ToDictionary(
       i => (string)alternatingKeysValues.ElementAt(i * 2 - 2), 
       i => alternatingKeysValues.ElementAt(i)); 
    } 
} 

這就是說,我認爲像Eric的回答實際上更好。在非常囉嗦的分配Dictionary<object, string>的快捷方式可以讓您非常接近您的理想,而不會犧牲清晰度或由Dictionary的內置集合初始值設定項提供的自然錯誤檢查。

我會去一個稍微清晰的措辭,但是:

using Dict = System.Collections.Generic.Dictionary<string, object>; 

用法:

MyMethod(new Dict {{string1, value1},{string2, value2}}); 

更重要的是,與事,其實說明你的字典包含,例如,fruitPrices更換Dict如果你的密鑰是FruitName而你的值是Price

+0

我高度模糊了我的代碼(我真的很想知道爲什麼很多人在他們發佈問題時不會這麼做)。我發送一對列名/值來構建查詢。所以這個類可能是「參數」或「參數」,也許呢?基本上,這是一個巨大的重構,基於這個詞典構建查詢,爲詞典中的每個項目添加「&& [tablename]。[key] = [value]」。由於它是實體框架,因此我使用實體名稱作爲表名稱,並將其複數化。而且我這樣做了一百萬次,所以很快得到速記。 – vbullinger

+0

我這樣做了:我做了一個擴展Dictionary 的Params類。那麼隨處可以包含這個更容易。它在命名空間中,大多數這些文件已經在使用。 – vbullinger

+0

如果我理解正確,我會推薦'NamedValues = System.Collections.Generic.Dictionary ;'。我認爲'NamedValues'明確表示每一對都包含一個列名和一個值。 – devuxer