У меня есть List<KeyValuePair<string, othertype>>
. Мне нужно что-то сделать в строках
list.Find(x=>x.Key=="foobar")
Однако, если это не существует в списке, каково будет поведение? Обычно он возвращает null, но структуры не могут быть нулевыми.
У меня есть List<KeyValuePair<string, othertype>>
. Мне нужно что-то сделать в строках
list.Find(x=>x.Key=="foobar")
Однако, если это не существует в списке, каково будет поведение? Обычно он возвращает null, но структуры не могут быть нулевыми.
Он вернет default(T)
, который будет таким же, как new KeyValuePair<string, othertype>>()
, то есть инициализированная по умолчанию структура.
В принципе, для ссылочных типов по умолчанию всегда null
, а для типов значений (включая struct
) это значение по умолчанию (0
для чисел, false
для bool
, a struct
с каждым поле по умолчанию для структур и т.д.)
Итак, для a default(KeyValuePair<string, othertype>>)
вы вернете KVP, где Key
был null
(по умолчанию для string
) и независимо от default(othertype)
(как в приведенных выше примерах)..
Из MSDN:
Первый элемент, который соответствует условиям, определенным указанным предикат, если он найден; в противном случае значение по умолчанию для типа T.
Используя это, если вы хотите проверить и посмотреть, вернули ли вы default
, я бы рекомендовал проверить yourResult.Key != null
, чтобы узнать, есть ли у вас результат, или вы можете использовать другой метод Find
как FindIndex
, как предлагает Оливье.
Мой совет - использовать FindIndex
для типов с нулевыми значениями
int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
// found!
UseResult(list[index]);
}
Значение по умолчанию default(T)
возвращается, если Find()
не выполняется. Для типов с нулевым значением этот результат нельзя отличить от обычных записей, имеющих значение по умолчанию. Это также верно для типов с нулевым значением, когда список может содержать обычные записи null
.
Структура - это тип значения. поэтому в случае структуры Find вернет значение по умолчанию структуры.
Пример:
Допустим, что у нас есть структура, как показано ниже,
public struct Test
{
public int i;
}
List<Test> list = new List<test>() { new Test { i = 1 } };
Test result = list.Find(o => o.i == 2);
В приведенном выше значении Найти результат, как новый Test(). вы можете сравнить значение ниже кода.
if (resul.Equals(new Test()))
{
//Do something
}
else
{
//Do something
}
ИЛИ
if (resul.Equals(default(Test)))
{
//Do something
}
else
{
//Do something
}
Прочитав эти две статьи документации, мне кажется, что вам нужно вернуть значение по умолчанию для вашей структуры:
Значения по умолчанию: http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx
Список (T). Метод поиска: http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx