2015-10-20 99 views
2

我試圖檢索字典中的特定對,這對轉換成字符串,如下列之一:如何檢索字典鍵/值,並將它們組合爲一個字符串

 Dictionary<string, string> testDictionary= new Dictionary<string, string>(); 
     testDictionary.Add("3123", "1"); 
     testDictionary.Add("3523", "2"); 
     testDictionary.Add("5532", "1"); 

     string memberId="5532"; 
     string finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).ToString(); 

     Console.WriteLine(finalSelectedValue); 

然而,我不知道如何實現將特定對的Key和Value組合在字典中的最後一步。

預期的結果是: 「5532_1」

回答

1

你不需要LINQ這裏,因爲字典不能有重複鍵。你真正需要的 - 只是通過key來輸入和格式化其值(字典是非常高效的完成這個任務):

string memberId = "5532"; 
string value; 

if (testDictionary.TryGetValue(memberId, out value)) 
{ 
    string finalSelectedValue = String.Format("{0}_{1}", memberId, value); 
} 
else 
{ 
    // member not found 
} 

少高性能,但一個班輪:

string finalSelectedValue = testDictionary.ContainsKey(memberId) ? 
    $"{memberId}_{testDictionary[memberId]}" : null; // C# 6 string formatting 

爲什麼你的方法不起作用?你正在計算所有的字典條目,以查找字典中是否存在某個關鍵字(這是一個大的矯枉過正)。 Where運算符將返回單個條目的空集合或集合(因爲字典不能有重複的鍵)。在此之後,您將過濾結果投影到字符串集合(再次爲一個或零個項目)。然後你將集合轉換爲字符串 - 但是這隻會返回集合的類型名稱IEnumerable<string>。要修復您的代碼,您需要將ToString()替換爲FirstOrDefault(),如果找不到條目,​​您將獲得單個格式化的字符串或null。但..見上面:)

+1

我喜歡這個解決方案。清晰和安全。沒有必要遍歷關鍵字,放棄首先使用字典的整體效率。 – itsme86

0

如何跳過LINQ和這樣做:

string finalSelectedValue = memberId + "_" + testDictionary[memberId]; 

testDictionary[memberId]將返回字典項memberId

0

的價值試試這個。

var finalSelectedValue = testDictionary.Where(x => x.Key == memberId).Select(y => y.Key + "_" + y.Value).FirstOrDefault(); 
0
var finalSelectedValue = string.Format("{0}_{1}", memberId, testDictionary[memberId]); 
+0

請爲您的代碼添加一些解釋。 –

0

Select要返回IEnumerable<KeyValuePair>。在這個IEnumerable上調用ToString不會提供你正在尋找的結果。儘管只需手動查找鍵並獲取值可能很簡單,但如果您在此尋找linq解決方案,則需要使用以某種方式枚舉返回的枚舉的調用來獲得結果,例如FirstFirstOrDefault,Single,SingleOrDefault等等。

你也可以做一個簡單的Func來做到這一點。你也應該定義當密鑰不存在時會發生什麼。我把它留作「?」因爲它沒有在你的帖子中提到。

Func<Dictionary<string,string>,string,string> specificPair = 
    (d,key) => d.ContainsKey(key) ? key + "_" + d[key] : "?"; 

,然後用它隨意

string finalSelectedValue = specificPair(testDictionary,memberId); 
相關問題