Как найти предмет в словаре? - PullRequest
34 голосов
/ 03 апреля 2011

Я объявил и заполнил следующую коллекцию.

protected static Dictionary<string, string> _tags;

Теперь я хочу найти определенную запись в коллекции.Я пробовал следующее.

thisTag = _tags.FirstOrDefault(t => t.Key == tag);
if (thisTag != default(KeyValuePair<string, string>))
    ...

И я получаю ошибку:

Оператор '! =' Не может быть применен к операндам типа 'System.Collections.Generic.KeyValuePair'и ''

Первоначально я пытался сравнить результат с null, и я думаю, что это не поддерживается с struct s.

Я бы подумал, что нахождениеПредмет в коллекции - очень тривиальная задача.Так как, черт возьми, я могу определить, был ли найден искомый предмет?

(Примечание: я использую Dictionary, потому что хочу быстрый поиск. Я знаю, что могу использовать Contains() для определенияесли предмет есть. Но это означает, что в общей сложности два поиска, что побеждает цель быстрого поиска. Я с радостью использую другую коллекцию, если она может быстро искать элемент, и у меня есть способ определить,это было успешно.)

Ответы [ 4 ]

90 голосов
/ 03 апреля 2011
thisTag = _tags.FirstOrDefault(t => t.Key == tag);

- это неэффективный и немного странный способ найти что-то по ключу в словаре.Поиск в ключе - это основная функция словаря.

Базовое решение будет следующим:

if (_tags.Containskey(tag)) { string myValue = _tags[tag]; ... }

Но для этого требуется 2 поиска.

TryGetValue(key, out value) более лаконичен и эффективен, он выполняет только 1 поиск.И это отвечает на последнюю часть вашего вопроса, лучший способ выполнить поиск:

string myValue;
if (_tags.TryGetValue(tag, out myValue)) { /* use myValue */ }

VS 2017 обновление, для C # 7 и выше, мы можем объявить переменную результата встроенной:

if (_tags.TryGetValue(tag, out string myValue))
{
    // use myValue;
}
// use myValue, still in scope, null if not found
7 голосов
/ 21 августа 2012

Иногда вам все равно нужно использовать FirstOrDefault, если вам приходится делать разные тесты.Если компонент Key вашего словаря обнуляется, вы можете сделать это:

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

Используя FirstOrDefault, ключ и значение возвращаемого KeyValuePair будут равны нулю, если совпадение не найдено.

0 голосов
/ 17 февраля 2017

Найти элемент в коллекции Dictionary можно с помощью ContainsKey или TryGetValue следующим образом:

class Program
{
    protected static Dictionary<string, string> _tags = new Dictionary<string,string>();

    static void Main(string[] args)
    {
        string strValue;

        _tags.Add("101", "C#");
        _tags.Add("102", "ASP.NET");

        if (_tags.ContainsKey("101"))
        {
            strValue = _tags["101"];
            Console.WriteLine(strValue);
        }

        if (_tags.TryGetValue("101", out strValue))
        {
            Console.WriteLine(strValue);
        }
    }
}
0 голосов
/ 04 октября 2014

Конечно, если вы хотите убедиться, что он там, в противном случае произойдет сбой, тогда это сработает:

thisTag = _tags [ключ];

ПРИМЕЧАНИЕ. Это не будет работать, если ключ, значениепары не существует, но иногда это именно то, что вы хотите.Таким образом, вы можете поймать это и сделать что-то с ошибкой.Я сделал бы это только в том случае, если я уверен, что пара ключ-значение находится или должна быть в словаре, и если нет, я хочу, чтобы он узнал об этом с помощью throw.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...