Al buscar una respuesta a esta pregunta, me he encontrado con otras similares que utilizan LINQ, pero no he podido entenderlas completamente (y, por lo tanto, implementarlas), ya que no estoy familiarizado con ella. Lo que me gustaría, básicamente, es esto:
- Compruebe si algún elemento de una lista contiene una cadena específica.
- Si es así, obtén ese elemento.
Sinceramente, no sé cómo haría para hacer eso. Lo que se me ocurre es esto (no funciona, por supuesto):
if (myList.Contains(myString))
string element = myList.ElementAt(myList.IndexOf(myString));
Sé POR QUÉ no funciona:
myList.Contains()
no regresatrue
, ya que verificará si un elemento completo de la lista coincide con la cadena que especifiqué.myList.IndexOf()
no encontrará una ocurrencia, ya que, como es el caso nuevamente, verificará si hay un elemento que coincida con la cadena.
Aún así, no tengo idea de cómo resolver este problema, pero creo que tendré que usar LINQ como se sugiere en preguntas similares a las mías. Dicho esto, si ese es el caso aquí, me gustaría que el respondedor me explique el uso de LINQ en su ejemplo (como dije, no me he molestado en mi tiempo con C #). Gracias de antemano chicos (y chicas).
EDITAR: se me ocurrió una solución; simplemente recorra la lista, verifique si el elemento actual contiene la cadena y luego configure una cadena igual al elemento actual. Sin embargo, me pregunto, ¿hay una forma más eficiente que esta?
string myString = "bla";
string element = "";
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Contains(myString))
element = myList[i];
}
myString
, en su ciclo actual, obtendrá el último elemento. Depende de usted si desea encontrar el primero o el último, si solo desea encontrar el primero, luego rompa el ciclo después de encontrar el artículo.Respuestas:
Debería poder usar Linq aquí:
Si simplemente desea devolver el primer elemento coincidente:
fuente
Where
conFirstOrDefault
en su segundo casomyList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
matching
determinado por el compilador (var
)? Como sé que mi lista es de tipoString
, ¿sería seguro usarlastring matching
en este caso?La respuesta básica es: necesita iterar a través del bucle y verificar que cualquier elemento contenga la cadena especificada. Entonces, digamos que el código es:
El código equivalente, pero conciso, es:
Aquí, x es un parámetro que actúa como "elemento" en el código anterior.
fuente
fuente
Los bucles antiguos son casi siempre los más rápidos.
fuente
Si desea una lista de cadenas que contiene su cadena:
Otra opción es usar Linq FirstOrDefault
Tenga en cuenta que el
Contains
método distingue entre mayúsculas y minúsculas.fuente
Puede usar el
FirstOrDefault
método de extensión de Linq :Esto devolverá el primer elemento que contiene la subcadena
myString
, onull
si no se encuentra dicho elemento.Si todo lo que necesita es el índice, use el método de la
List<T>
claseFindIndex
:Esto devolverá el índice del primer elemento que contiene la subcadena
myString
, o-1
si no se encuentra dicho elemento.fuente
Muchas buenas respuestas aquí, pero uso una simple usando Exists , como se muestra a continuación:
fuente
Deberías poder usar algo como esto, me ha funcionado bien:
o algo como esto, si necesita mirar donde no coincide.
fuente
puedes usar
LINQ le proporciona capacidades para "consultar" cualquier recopilación de datos. Puede usar la sintaxis como una consulta de base de datos (seleccionar, dónde, etc.) en una colección (aquí la colección (lista) de cadenas).
así que estás haciendo como "conseguirme elementos de la lista donde satisface una condición dada"
dentro de donde está utilizando una "expresión lambda"
decir brevemente la expresión lambda es algo así como (parámetro de entrada => valor de retorno)
entonces para un parámetro "item", devuelve "item.Contains (" string requerido ")". Por lo tanto, devuelve verdadero si el elemento contiene la cadena y, por lo tanto, se selecciona de la lista ya que cumple la condición.
fuente
Para que sea simple, use esto;
Alternativamente, para hacer esto con for loop, use esto;
fuente
No he visto la opción bool en otras respuestas, así que espero que el siguiente código ayude a alguien.
Solo usa
Any()
fuente
Es posible combinar Any, Where, First y FirstOrDefault; o simplemente coloque el predicado en cualquiera de esos métodos dependiendo de lo que se necesite.
Probablemente debería evitar usar First a menos que desee que se lance una excepción cuando no se encuentre ninguna coincidencia. FirstOrDefault suele ser la mejor opción siempre que sepa que devolverá el valor predeterminado del tipo si no se encuentra una coincidencia (el valor predeterminado de la cadena es nulo, int es 0, bool es falso, etc.).
Pruebe este código @ https://rextester.com/TXDL57489
fuente