Здесь у меня есть простой пример, чтобы найти элемент в списке строк. Обычно я использую для цикла или анонимного делегата, чтобы сделать это так:
int GetItemIndex(string search)
{
int found = -1;
if ( _list != null )
{
foreach (string item in _list) // _list is an instance of List<string>
{
found++;
if ( string.Equals(search, item) )
{
break;
}
}
/* use anonymous delegate
string foundItem = _list.Find( delegate(string item) {
found++;
return string.Equals(search, item);
});
*/
}
return found;
}
LINQ является новым для меня. Мне интересно, могу ли я использовать LINQ, чтобы найти элемент в списке? Как, если возможно?
Ответы:
Есть несколько способов (обратите внимание, что это не полный список).
1) Single вернет один результат, но сгенерирует исключение, если не найдет ни одного, или более одного (что может или не может быть тем, что вы хотите):
Примечание
SingleOrDefault()
будет вести себя так же, за исключением того, что оно будет возвращать null для ссылочных типов или значение по умолчанию для типов значений вместо исключения.2) Где будут возвращаться все элементы, которые соответствуют вашим критериям, поэтому вы можете получить IEnumerable с одним элементом:
3) Сначала вернет первый элемент, который соответствует вашим критериям:
Примечание
FirstOrDefault()
будет вести себя так же, за исключением того, что оно будет возвращать null для ссылочных типов или значение по умолчанию для типов значений вместо исключения.источник
ReadOnlyCollection
илиObservableCollection
?IEnumerable<T>
илиIQueryable<T>
Если вы хотите индекс элемента, это сделает это:
Вы не можете избавиться от лямбды в первом проходе.
Обратите внимание, что это бросит, если элемент не существует. Это решает проблему, прибегая к обнуляемым типам:
Если вы хотите товар:
Если вы хотите посчитать количество элементов, которые соответствуют:
Если вы хотите, чтобы все элементы соответствовали:
И не забудьте проверить список
null
в любом из этих случаев.Или используйте
(list ?? Enumerable.Empty<string>())
вместоlist
.Спасибо Павлу за помощь в комментариях.
источник
string.Equals
- ничего страшного==
. Во-вторых, я бы также упомянулFirstOrDefault
(для случаев, когда элемент может отсутствовать) иSelect
с индексом, чтобы покрыть случай, когда нужен индекс элемента (как в примере в самом вопросе).ArgumentNullException
если источник нулевойЕсли
List<string>
вам действительно не нужен LINQ, просто используйте:Если вы ищете сам предмет, попробуйте:
источник
_list.Find(search)
второй.Вы хотите элемент в списке или сам фактический элемент (предполагал бы сам элемент).
Вот несколько вариантов для вас:
источник
Этот метод проще и безопаснее
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
источник
true : false
ниже, должны работать одинаковоbool insertOrderNew = lOrders.Find(r => r == "1234") == null;
Как насчет
IndexOf
?Например
Обратите внимание, что он возвращает -1, если значение не появляется в списке
источник
Раньше я использовал словарь, который является своего рода индексированным списком, который даст мне именно то, что я хочу, когда захочу.
Например, всякий раз, когда я хочу получить доступ к своим значениям полей, я обращаюсь к своему словарю:
Таким образом, в зависимости от того, что вы делаете, словарь может быть полезным.
источник
Вот один из способов переписать ваш метод для использования LINQ:
Таким образом, называя это
GetItemIndex("two")
вернется1
,и
GetItemIndex("notthere")
вернется-1
.Ссылка: linqsamples.com
источник
Попробуйте этот код:
источник
Если нам нужно найти элемент из списка, то мы можем использовать метод
Find
иFindAll
расширения, но между ними есть небольшая разница. Вот пример.источник
Это поможет вам получить первое значение или значение по умолчанию в поиске Linq List
Этот поиск найдет первое или заданное по умолчанию значение.
источник
Вы хотите найти объект в списке объектов.
Это поможет вам получить первое значение или значение по умолчанию в поиске Linq List.
или
источник
Вы можете использовать FirstOfDefault с расширением Where Linq, чтобы получить класс MessageAction из IEnumerable. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
где
Список действий {get; устанавливать; }
источник