2014-01-28 5 views
19

Что такое значение по умолчанию KeyValuePair<string, int>?Что такое значение по умолчанию `KeyValuePair <string, int>`?

например. Я бег запрос LINQ и возвращение FirstOrDefault() значения из него

KeyValuePair<string, int> mapping = (from p in lstMappings 
    where p.Key.Equals(dc.ColumnName, StringComparison.InvariantCultureIgnoreCase) 
    select p).FirstOrDefault(); 

if (mapping != null) 
{ 

} 

как проверить, если mapping объекта является нулевым/пустой
(я получаю компиляцию ошибки времени в коде выше Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<string,int>' and '<null>')

PS: lstMappings имеет тип

List<KeyValuePair<string, int>> 
+1

Это очень плохое использование запроса LINQ. Вы не должны использовать LINQ там вообще.Если вы хотите иметь возможность обращаться с вашими ключами без учета регистра, вам следует предоставить свой собственный IEqualityComparer, который будет делать именно это. Затем вы просто использовали метод ContainsKey словаря, чтобы определить, есть ли совпадение и, если есть, получить значение с помощью этого ключа. – jmcilhinney

+0

дубликат [По умолчанию для KeyValuePair] (http://stackoverflow.com/q/1641392/3834) – Graviton

ответ

26

значение по умолчанию любого типа Т default(T), поэтому для 100% теоретической точности можно было бы написать

if (!mapping.Equals(default(KeyValuePair<string, int>))) { 
    // ... 
} 

Поскольку KeyValuePair является struct (т.е. тип значения), вы не можете сравнить его с null. Независимо от этого, сравнение значений с == ошибочно в качестве подхода по умолчанию, потому что, если он используется в ссылочных типах, он обычно проверяет ссылочное равенство.

16

KeyValuePair<T, T> является структурой. Таким образом, это тип значения, не может быть null и будет инициализирован значениями по умолчанию для члена.

Для KeyValuePair<string, int> это будет строка null, а значение int 0.

KeyValuePair<string, int> kvp = default(KeyValuePair<string, int>); 
Console.WriteLine(kvp.Key == null); // True 
Console.WriteLine(kvp.Value == 0); // True 

Так же, как я использовал default(T) чтобы инициализировать объект со значением по умолчанию, вы также можете использовать его, чтобы сравнить свой результат с ним, чтобы выяснить, если это значение по умолчанию или нет:

if (!mapping.Equals(default(KeyValuePair<string, int>))) 
{ … } 

Другой альтернативой, если вы все равно не хотите работать со значением по умолчанию, было бы просто использовать First и проверить исключение, которое генерируется, когда нет значения результата.

+0

Используя ваш пример сравнения с по умолчанию, я получаю 'Operator '! =' Не может применяться к операндам типа ' System.Collections.Generic.KeyValuePair 'и' System.Collections.Generic.KeyValuePair ''. В противном случае, хороший ответ. – xr280xr

+0

@ xr280xr Да, я этого не осознавал. Большое спасибо! – poke

4

KeyValuePair<TKey, TValue> - это структура, поэтому тип значения и не может быть null. Значение по умолчанию для структуры - это значение, заполняемое значениями по умолчанию для его членов. В данном примере это будет:

новый KeyValuePair (нуль, 0)


Это должно ответить на ваш прямой вопрос, но более изящный способ сделать сравнение вы пытаетесь сделать, для использования ключевого слова default.

if (mapping != default(KeyValuePair<string, int>)) 
{ 
    // Mapping has default value 
} 

Вы можете использовать эквивалентный код для любого другого типа рядом KeyValuePair<TKey, TValue>. Для ссылочных типов default вернет null, в противном случае оно вернет значение значения по умолчанию.

+1

Значение по умолчанию для строки равно null, а не пустой строке. – poke

Смежные вопросы