通过键从字典中获取单个值

7
var listaFirme = new Dictionary<string, string>
{
    { "foo", "bar" }
};

var matchKey = "foo";

return listaFirme.Where(pair => pair.Key == matchKey).Select(pair => pair.Value).ToString();

我知道字典中的键是唯一的,所以我想返回一个值。但在这种情况下,它无法正常工作,因为它返回字符串"System.IEnumerable<String>"...


Select 返回一个 IEnumerable。也许你应该在 Select 调用中添加 FirstOrDefault - Chris Dunaway
既然你有一个字典,为什么不使用字典特别提供的方法,例如索引器或TryGetValue?你目前的方法失去了使用字典的所有性能优势... - Jon Skeet
4个回答

21

你好像把这个问题弄得太复杂了。

你可以使用 Dictionary 类的索引器 ([]) 和 .ContainsKey() 方法。

如果你用类似下面的代码:

string value;
if (myDict.ContainsKey(key))
{
    value = myDict[key];
}
else
{
    Console.WriteLine("Key Not Present");
    return;
}

你应该达到你想要的效果。


7
不要使用ContainsKey[]结合的方式,这会使字典需要进行两次查找。改用TryGetValue方法。 - Scott Chamberlain
没错,但如果你的字典不是很大,为了简单起见,我更喜欢使用这个。 - ScottishTapWater

13

如果您想从通过索引器或 TryGetValue 访问的字典中检索键的值:

var value = listaFirme[matchKey];

//If you don't know for sure that dictionary contains key
string value;
if(a.TryGetValue(matchKey, out value))
{
    /* Code here */
}

关于您为什么得到了这样的结果:Linq操作中的Where和Select返回一个IEnumerable ,因此在对其执行ToString时,它会执行IEnumerable的ToString,打印出其类型。
注意,listaFirme不是字典的好名称。
如果您没有字典并且想要返回一个项目,则可以使用FirstOrDefault:
var value = someList.FirstOrDefault(item => /* some predicate */)?.Value;

3
看起来你使用过于复杂了。在这种情况下,你不需要使用 Linq。 只需使用提供的 Dictionary 索引器: listaFirme[matchKey]。这将返回相关值。如果键不存在,则 Dictionary 会抛出一个 KeyNotFoundException 异常。如果您想检查键是否存在,可以使用 ContainsKey() 方法,它将返回一个布尔值。

0

toString(); 替换为 FirstOrDefault();

当您应用 .Where() 条件时,它将返回一个 Enumerable。 您必须使用 .ToList() 将其转换为列表,然后您将获得符合您使用的条件的值的列表,或者如果您只想获取第一个,则可以使用 FirstOrDefault();

您也可以这样写

listaFirme.FirstOrDefault(pair => pair.Key == matchKey).Value

FirstOrDefault() 接受一个谓词,因此您不必总是使用 .Where


我希望现在更好了。 - Munzer
这是最好的,最简单的且只有一行代码的解决方案。 - arianit ax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接