在C#中返回字典值而不将其赋值给变量?

时间:2016-08-05 08:26:15

标签: c# dictionary

我想使用字典的值而不将其分配给变量:

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 [???]));

我知道我可以编写一个带有开关的函数,它的工作方式类似,但是使用字典可能会更便宜,因为我有更长的列表。 谢谢你的建议!

4 个答案:

答案 0 :(得分:6)

您可以使用Dictionary之类的密钥访问var x = LayoutByID[0];但如果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"}");

答案 1 :(得分: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, ""));)

使用扩展方法,您将获得更清晰,更易读的代码,并且可以在其他地方使用相同的逻辑

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您似乎不希望分配给变量的问题似乎是您希望在简短而简洁的代码中检索字典值而不会产生额外的“噪音”。必须检查值是否存在并防止&#34;未处理的空例外&#34;。

在这种情况下,我建议使用null-coalescing operator.它的工作原理如下:

x ?? y

如果x为null,则使用y。如果x不为null,则使用x。

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

这样您就不必先进行任何检查,如果为空,您将被默认为&#34;未找到值&#34;。

也就是说,在Console.WriteLine()中添加一些逻辑可能不是最好的选择。我个人更愿意这样做(虽然你说过你不想先分配给变量):

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