Aqui eu tenho um exemplo simples para encontrar um item em uma lista de strings. Normalmente eu uso for loop ou delegado anônimo para fazer o seguinte:
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 é novo para mim. Estou curioso para saber se posso usar o LINQ para encontrar itens na lista? Como se possível?
Respostas:
Existem algumas maneiras (observe que essa não é uma lista completa).
1) Single retornará um único resultado, mas lançará uma exceção se encontrar nenhum ou mais de um (que pode ou não ser o que você deseja):
A nota
SingleOrDefault()
se comportará da mesma forma, exceto que retornará nulo para tipos de referência ou o valor padrão para tipos de valores, em vez de lançar uma exceção.2) Onde retornará todos os itens que correspondem aos seus critérios, para que você possa obter um IEnumerable com um elemento:
3) Primeiro retornará o primeiro item que corresponde aos seus critérios:
A nota
FirstOrDefault()
se comportará da mesma forma, exceto que retornará nulo para tipos de referência ou o valor padrão para tipos de valores, em vez de lançar uma exceção.fonte
ReadOnlyCollection
ouObservableCollection
?IEnumerable<T>
ouIQueryable<T>
Se você deseja o índice do elemento, isso será feito:
Você não pode se livrar do lambda no primeiro passe.
Observe que isso será lançado se o item não existir. Isso resolve o problema recorrendo a ints anuláveis:
Se você deseja o item:
Se você deseja contar o número de itens que correspondem:
Se você deseja todos os itens que correspondem:
E não se esqueça de verificar a lista
null
em qualquer um desses casos.Ou use em
(list ?? Enumerable.Empty<string>())
vez delist
.Obrigado a Pavel por ajudar nos comentários.
fonte
string.Equals
aqui - nada de errado==
. Segundo, eu também mencionariaFirstOrDefault
(nos casos em que o item pode não estar lá), eSelect
com o índice para cobrir o caso em que o índice do item é necessário (como é o exemplo da própria pergunta).ArgumentNullException
se a fonte for nulaSe realmente for um,
List<string>
você não precisa de LINQ, basta usar:Se você estiver procurando pelo item em si, tente:
fonte
_list.Find(search)
o segundo.Deseja o item na lista ou o próprio item real (assumiria o próprio item).
Aqui estão algumas opções para você:
fonte
Este método é mais fácil e seguro
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
fonte
true : false
abaixo deve funcionar mesmobool insertOrderNew = lOrders.Find(r => r == "1234") == null;
Que tal
IndexOf
?Por exemplo
Observe que ele retorna -1 se o valor não ocorrer na lista
fonte
Eu costumava usar um dicionário que é algum tipo de lista indexada que me dá exatamente o que eu quero quando quero.
Sempre que desejo acessar meus valores de margens, por exemplo, dirijo-me ao meu dicionário:
Portanto, dependendo do que você está fazendo, um dicionário pode ser útil.
fonte
Aqui está uma maneira de reescrever seu método para usar o LINQ:
Assim, chamando-o com
GetItemIndex("two")
retornará1
,e
GetItemIndex("notthere")
retornará-1
.Referência: linqsamples.com
fonte
Tente este código:
fonte
Se precisarmos encontrar um elemento da lista, podemos usar o método
Find
eFindAll
extensions, mas há uma pequena diferença entre eles. Aqui está um exemplo.fonte
Isso o ajudará a obter o primeiro valor ou o valor padrão em sua pesquisa na lista Linq
Esta pesquisa encontrará o primeiro valor ou valor padrão que ele retornará.
fonte
Você deseja pesquisar um objeto na lista de objetos.
Isso ajudará você a obter o primeiro valor ou o valor padrão na sua pesquisa da lista Linq.
ou
fonte
Você pode usar FirstOfDefault com a extensão Where Linq para obter uma classe MessageAction do IEnumerable. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
Onde
Listar ações {get; conjunto; }
fonte