Enquanto procurava por uma resposta para essa pergunta, encontrei outras usando o LINQ, mas não consegui entendê-las completamente (e, portanto, implementá-las), pois não estou familiarizado com ela. O que eu gostaria, basicamente, é o seguinte:
- Verifique se algum elemento de uma lista contém uma sequência específica.
- Se isso acontecer, obtenha esse elemento.
Sinceramente, não sei como eu faria isso. O que posso pensar é isso (não está funcionando, é claro):
if (myList.Contains(myString))
string element = myList.ElementAt(myList.IndexOf(myString));
Eu sei por que não funciona:
myList.Contains()
não retornatrue
, pois verificará se um elemento inteiro da lista corresponde à sequência especificada.myList.IndexOf()
não encontrará uma ocorrência, pois, como é o caso novamente, ele verificará se há um elemento correspondente à string.
Ainda assim, não tenho idéia de como resolver esse problema, mas acho que terei que usar o LINQ conforme sugerido em perguntas semelhantes às minhas. Dito isto, se esse for o caso aqui, eu gostaria que o respondente me explicasse o uso do LINQ no exemplo deles (como eu disse, não me importei com isso no meu tempo com C #). Agradeço desde já pessoal (e galões?).
EDIT: Eu vim com uma solução; basta percorrer a lista, verificar se o elemento atual contém a sequência e defina uma sequência igual ao elemento atual. Gostaria de saber, porém, existe uma maneira mais eficiente do que isso?
string myString = "bla";
string element = "";
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Contains(myString))
element = myList[i];
}
myString
. No loop atual, você obterá o último elemento. Depende de você se você deseja encontrar o primeiro ou o último, se você apenas deseja encontrar o primeiro e, em seguida, interrompa o ciclo depois de encontrar o item.Respostas:
Você deve poder usar o Linq aqui:
Se você deseja simplesmente devolver o primeiro item correspondente:
fonte
Where
porFirstOrDefault
seu segundo caso #myList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
matching
é determinado pelo compilador (var
)? Como sei que minha lista é do tipoString
, seria seguro usástring matching
-lo nesse caso?A resposta básica é: você precisa percorrer o loop e verificar se algum elemento contém a sequência especificada. Então, digamos que o código é:
O código equivalente, mas conciso, é:
Aqui, x é um parâmetro que age como "item" no código acima.
fonte
fonte
Loops à moda antiga são quase sempre os mais rápidos.
fonte
Se você deseja uma lista de cadeias contendo sua cadeia:
Outra opção é usar o Linq FirstOrDefault
Lembre-se de que o
Contains
método diferencia maiúsculas de minúsculas.fonte
Você pode usar o
FirstOrDefault
método de extensão do Linq :Isso retornará o elemento fist que contém a substring
myString
ounull
se nenhum elemento for encontrado.Se tudo o que você precisa é o índice, use o método
List<T>
da classeFindIndex
:Isso retornará o índice do elemento fist que contém a substring
myString
ou-1
se nenhum elemento for encontrado.fonte
Muitas boas respostas aqui, mas eu uso uma simples usando Existe , como abaixo:
fonte
Você deve poder usar algo como isto, funcionou bem para mim:
ou algo assim, se você precisar procurar onde não corresponde.
fonte
você pode usar
O LINQ fornece recursos para "consultar" qualquer coleção de dados. Você pode usar a sintaxe como uma consulta ao banco de dados (selecione, onde, etc) em uma coleção (aqui a coleção (lista) de cadeias).
então você está fazendo como "pegue itens da lista Onde ele satisfaz uma determinada condição"
dentro de Onde você está usando uma "expressão lambda"
dizer brevemente que a expressão lambda é algo como (parâmetro de entrada => valor de retorno)
portanto, para um parâmetro "item", ele retorna "item.Contains (" required string ")". Portanto, ele retornará true se o item contiver a string e, assim, for selecionado na lista, pois satisfez a condição.
fonte
Para simplificar, use isso;
Como alternativa, para fazer isso com o loop for, use isto;
fonte
Eu não vi a opção bool em outras respostas, então espero que o código abaixo ajude alguém.
Apenas use
Any()
fonte
É possível combinar Any, Where, First e FirstOrDefault; ou apenas coloque o predicado em qualquer um desses métodos, dependendo do que for necessário.
Provavelmente, você deve evitar o uso do First, a menos que queira ter uma exceção lançada quando nenhuma correspondência for encontrada. FirstOrDefault geralmente é a melhor opção, desde que você saiba que retornará o padrão do tipo se nenhuma correspondência for encontrada (o padrão da string é nulo, int é 0, bool é falso, etc.).
Teste este código em https://rextester.com/TXDL57489
fonte