Найти элемент в списке <>, который содержит значение
У меня есть 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
Есть ли более чистый способ сделать это?
Ответы
Ответ 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);
Это позволяет вашему коду игнорировать специальные символы, верхний и нижний регистр. Есть больше вариантов.