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

Найти элемент в списке <>, который содержит значение

У меня есть List<MyClass> MyList, где

public class MyClass
{
    public string name { get; set; }
    public string value { get; set; }
}

Учитывая имя, я хотел бы получить соответствующее значение. В настоящее время я реализую его как:

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value

Есть ли более чистый способ сделать это?

4b9b3361

Ответ 1

Либо используйте LINQ:

var value = MyList.First(item => item.name == "foo").value;

(Это, скорее всего, найдет первое совпадение. В этом есть много вариантов.)

Или используйте Find вместо FindIndex:

var value = MyList.Find(item => item.name == "foo").value;

Я бы настоятельно рекомендовал использовать LINQ, хотя в наши дни это гораздо более идиоматический подход.

(Я также предлагаю следовать соглашениям об именах .NET.)

Ответ 2

Вы можете использовать Where для фильтрации и Select, чтобы получить требуемое значение.

MyList.Where(i=>i.name == yourName).Select(j=>j.value);

Ответ 3

Использование функции Поиск - это более чистый способ.

MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}

Ответ 4

Enumerable.First возвращает элемент вместо индекса. В обоих случаях вы получите исключение, если в списке не появится соответствующий элемент (ваш исходный код будет бросать IndexOutOfBoundsException при попытке получить элемент по индексу -1, но First будет генерировать InvalidOperationException).

MyList.First(item => string.Equals("foo", item.name)).value

Ответ 5

Я использовал бы .Equals() для сравнения вместо ==.

Так же:

MyClass item = MyList.Find(item => item.name.Equals("foo"));

В частности, потому что он дает вам такие параметры, как StringComparison, что является удивительным. Пример:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);

Это позволяет вашему коду игнорировать специальные символы, верхний и нижний регистр. Есть больше вариантов.