2016-08-05 77 views
0

我想使用的字典的值而不將其分配給一個變量:在C#中返回字典值而不將其分配給變量?

Dictionary<int, string> LayoutByID = new Dictionary<int, string>() { 
    { 0, "foo"}, 
    { 1, "bar"} 
    // ... 
}; 

我可以爲例如打印值,如果我創建一個變量:

string b; 
LayoutByID.TryGetValue(1,out b); 
print("Trying Dictionary to retrieve value for 1: " + b); 

但我不知道是否有更簡單的方法,是這樣的:

print("Trying Dictionary to retrieve value for 1: " + LayoutByID.TryGetValue(1 [???])); 

我明白我可以寫一個函數中有一個交換機會起到類似的作用,但使用字典可能更便宜,因爲我有更長的列表。 感謝您的諮詢!

+2

如果密鑰不存在,你會希望發生什麼?此外,分配給變量不需要花費任何東西。將以任何方式生成對該值的引用。 –

+0

在當前的情況下,我可以很容易地確保密鑰存在,因爲我對雙方都有控制權。儘管如此,非常方便知道如何處理異常情況。 – Adam

回答

6

您可以使用var x = LayoutByID[0];等密鑰訪問Dictionary但如果Dictionary不包含具有該密鑰的條目,則會發生異常。

爲了避免異常被拋出,可以先檢查是否使用LayoutByID.ContainsKey()存在的關鍵 - 然後寫你的邏輯,這種情況下:

if (LayoutByID.ContainsKey(0)) // Check if the key exists (replace 0 with whatever) 
{ 
    var x = LayoutByID[0]; // Access the value and do whatever with it 
    // ... 
} 
else 
{ 
    // Key doesn't exist: 
    // Do something else 
} 

或C#6.0,你可以同時打印這樣

var key = -1; 
var myString = string.Empty; 
LayoutByID.TryGetValue(key, out myString); 
Console.WriteLine($"Trying Dictionary to retrieve value for {key}: {myString ?? "Error: Invalid ID"}"); 
+0

Tx!我知道必須有一個簡單的方法,但沒有谷歌想給我這個答案... – Adam

+1

要添加到這個,你也可以做一個檢查,看看它是否包含你後面的'Key':if(LayoutById .ContainsKey(0)){... // do stuff}' - 保存拋出的異常 –

+0

不要忘記標記爲答案,如果它幫助你:) –

1

您可以創建自己的擴展方法。

[Extension] 
public static string GetValueOrDefault<TKey, TValue>(this Dictionary<TKey, TValue>, 
                TKey key, 
                TValue defaultValue) 
{ 
    if(this.ContainKey(key) == true) return this[i]; 
    return defaultValue;  
} 

然後用它

Console.WriteLine("Print value for key 1: " + LayoutByID.GetValueOrDefault(1, ""));) 

隨着擴展方法,你會得到更多的更清晰可讀的代碼,並可以在其他地方

+1

LayoutByID.SingleOrDefault(kvp => kvp .Key.Equals(1))。值已經存在 - 它會給你的值或null,如果密鑰不存在。 –

1
int selectingvalue = 1; 
print(LayoutByID.ContainsKey(selectingvalue) ? LayoutByID.First(x => x.Key == selectingvalue).Value : ""); 
+0

你不能只是使用'print(LayoutById.First(x => x.Key == selectingvalue).Select(x => x.Value)'? –

+0

@Geoff James不知道這對我而言似乎不起作用 – Neil

+1

My壞的(這種方式是'IEnumerable's) - 你可以使用'LayoutByID.FirstOrDefault(x => x.Key == chosenValue).Value;' –

0

的問題用同樣的邏輯,你似乎有不想分配給一個變量似乎是你想要檢索一個簡短的代碼字典值沒有額外的'噪音'必須檢查存在的價值,並防止「未處理的無l例外「。

在這種情況下,我會建議使用一個null-coalescing operator.它的工作原理是這樣的:

x ?? y 

如果x爲空,Y將被使用。如果x不爲空,則將使用x。

Console.WriteLine($"Trying Dictionary to retrieve value for 1: {LayoutByID[0] ?? "value not found"}") 

這樣,您不必先做任何檢查,如果爲空,則默認爲「未找到值」。

也就是說,在Console.WriteLine()中放置一些邏輯可能不是最好的。我個人比較喜歡這樣做(儘管你已經說過你不想先指定一個變量):

var x = LayoutByID[0] ?? "value not found" 
Console.WriteLine($"Trying Dictionary to retrieve value for 1: {x}") 
+0

但是,如果密鑰不存在,Dictionary不會拋出異常?我知道如果這個鍵存在並且是'null'(這是一個好主意),那麼null結合運算符會設置一個不同的值,但是如果鍵不存在,您不應該考慮引發異常嗎? :) –

+0

是的,在這種情況下,您應該首先檢查鍵是否存在'LayoutByID.ContainsKey(0)'或頂部答案中討論的任何其他選項。如果您確定密鑰存在於字典中,則更簡潔的解決方案是使用空合併運算符。爲工作選擇正確的工具可能取決於問題之外的更多因素。 –