Подтвердить что ты не робот

Как работает List <T>.Find, когда T является структурой?

У меня есть List<KeyValuePair<string, othertype>>. Мне нужно что-то сделать в строках

list.Find(x=>x.Key=="foobar")

Однако, если это не существует в списке, каково будет поведение? Обычно он возвращает null, но структуры не могут быть нулевыми.

4b9b3361

Ответ 1

Он вернет 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, как предлагает Оливье.

Ответ 2

Мой совет - использовать FindIndex для типов с нулевыми значениями

int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
    // found!
    UseResult(list[index]);
}

Значение по умолчанию default(T) возвращается, если Find() не выполняется. Для типов с нулевым значением этот результат нельзя отличить от обычных записей, имеющих значение по умолчанию. Это также верно для типов с нулевым значением, когда список может содержать обычные записи null.

Ответ 3

Структура - это тип значения. поэтому в случае структуры 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    
 }