如何在字典集合中查找项目?

Jon*_*ood 36 c# generics dictionary

我已经声明并填充了以下集合.

protected static Dictionary<string, string> _tags;
Run Code Online (Sandbox Code Playgroud)

现在我想查找集合中的特定条目.我尝试了以下内容.

thisTag = _tags.FirstOrDefault(t => t.Key == tag);
if (thisTag != default(KeyValuePair<string, string>))
    ...
Run Code Online (Sandbox Code Playgroud)

我收到错误:

运算符'!='不能应用于'System.Collections.Generic.KeyValuePair'和''类型的操作数

最初我试图将结果与之比较null,我想s不支持struct.

我会认为在一个集合中找到一个项目是一项非常简单的任务.那么我如何确定是否找到了我正在寻找的物品?

(注意:我正在使用,Dictionary因为我想要快速查找.我知道我可以Contains()用来确定项目是否存在.但这意味着总共有两次查找,这有点挫败了快速查找的目的.我会如果它可以快速查找项目,我很高兴使用不同的集合,我有办法确定它是否成功.)

Hen*_*man 95

thisTag = _tags.FirstOrDefault(t => t.Key == tag);
Run Code Online (Sandbox Code Playgroud)

在字典中按键找到某些东西是一种低效且有点奇怪的方法.为Key找东西是Dictionary的基本功能.

基本解决方案是:

if (_tags.Containskey(tag)) { string myValue = _tags[tag]; ... }
Run Code Online (Sandbox Code Playgroud)

但这需要2次查找.

TryGetValue(key, out value)更简洁高效,只进行1次查找.这回答了问题的最后部分,查找的最佳方法是:

string myValue;
if (_tags.TryGetValue(tag, out myValue)) { /* use myValue */ }
Run Code Online (Sandbox Code Playgroud)

VS 2017更新,对于C#7及更高版本,我们可以内联声明结果变量:

if (_tags.TryGetValue(tag, out string myValue))
{
    // use myValue;
}
// use myValue, still in scope, null if not found
Run Code Online (Sandbox Code Playgroud)

  • 那么,第一个答案并不令人满意.但是你对'TryGetValue()`是正确的,我以前用过它.我想问题是我开始使用`List <>`集合并将其切换为`Dictionary <>`,同时仍然具有`List <>`思维模式. (3认同)
  • 我相信有一个拼写错误,它应该是`if(_tags.TryGetValue(tag,out myValue)){...}`而不是`TryGetValue(_tags,...)`. (2认同)
  • 又过了2.5年,它仍然在帮助人们。 (2认同)

ige*_*eau 7

如果您必须进行不同的测试,有时您仍然需要使用FirstOrDefault.如果您的词典的Key组件可以为空,则可以执行以下操作:

thisTag = _tags.FirstOrDefault(t => t.Key.SubString(1,1) == 'a');
if(thisTag.Key != null) { ... }
Run Code Online (Sandbox Code Playgroud)

使用FirstOrDefault,如果未找到匹配项,则返回的KeyValuePair的键和值都将为null.