У меня есть 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