2017-05-05 148 views
-2
var listaFirme = new Dictionary<string, string> 
{ 
    { "foo", "bar" } 
}; 

var matchKey = "foo"; 

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

我知道密钥是唯一的,所以我想从我的字典中返回一个值。通过密钥从字典中获取单个值

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 */ 
} 

至于:在这种情况下,如果你想从索引或TryGetValue字典访问检索键的值,这是行不通的,因为它返回字符串"System.IEnumerable<String>" ...

+0

'Select'返回一个Ienumerable。也许你应该添加'FirstOrDefault'到Select呼叫。 –

+0

由于您有字典,为什么不使用字典专门提供的方法,例如索引器或'TryGetValue'?您目前的方法失去了使用字典的所有性能优势... –

回答

2

它确实看起来像你过分复杂这个问题。

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

如果使用这样的事情:

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

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

+1

不要使用'ContainsKey'和'[]'对。你正在翻译字典必须做的查找。改为使用'TryGetValue'。 –

+0

的确如此,但是如果你的字典不是很大,我更喜欢为了简单起见而使用它。 –

5

为什么你得到了你做的结果:WhereSelect的Linq操作返回一个IEnumerable<T>,所以当它做ToString时,它执行ToStringIEnumerable这就是打印它的类型。

注意listaFirme是不是一个好名字了dictionary


如果你有没有一本字典,想返回一个项目,那么你会使用FirstOrDefault

var value = someList.FirstOrDefault(item => /* some predicate */)?.Value; 
-1

toString();替换为FirstOrDefault();

当您申请.Where()条件时,它将返回Enumerable。您必须使用.ToList()将其列入清单,然后您将得到符合您使用条件的值的列表,或者如果您只想获得第一个可以使用的值FirstOrDefault();

您也可以像这样写

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

由于FirstOrDefault()接受谓词,你不需要总是需要使用.Where

+0

是的,我正在编辑,而您正在输入此内容。 – Munzer

+0

我希望现在好一点。 – Munzer

1

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