Aquí tengo un ejemplo simple para encontrar un elemento en una lista de cadenas. Normalmente lo uso para un bucle o un delegado anónimo para hacerlo así:
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 es nuevo para mí. Tengo curiosidad por saber si puedo usar LINQ para encontrar un elemento en la lista. ¿Cómo es posible?
Respuestas:
Hay algunas formas (tenga en cuenta que esta no es una lista completa).
1) Single devolverá un único resultado, pero arrojará una excepción si encuentra ninguno o más de uno (que puede o no ser lo que desea):
La nota
SingleOrDefault()
se comportará igual, excepto que devolverá un valor nulo para los tipos de referencia o el valor predeterminado para los tipos de valor, en lugar de generar una excepción.2) Dónde devolverá todos los artículos que coincidan con sus criterios, por lo que puede obtener un IEnumerable con un elemento:
3) Primero devolverá el primer elemento que coincida con sus criterios:
La nota
FirstOrDefault()
se comportará igual, excepto que devolverá un valor nulo para los tipos de referencia o el valor predeterminado para los tipos de valor, en lugar de generar una excepción.fuente
ReadOnlyCollection
oObservableCollection
?IEnumerable<T>
oIQueryable<T>
Si desea el índice del elemento, esto lo hará:
No puedes deshacerte de la lambda en la primera pasada.
Tenga en cuenta que esto arrojará si el elemento no existe. Esto resuelve el problema recurriendo a entradas anulables:
Si quieres el artículo:
Si desea contar la cantidad de elementos que coinciden:
Si quieres todos los artículos que coinciden:
Y no olvide consultar la lista
null
en cualquiera de estos casos.O usar en
(list ?? Enumerable.Empty<string>())
lugar delist
.Gracias a Pavel por ayudar en los comentarios.
fuente
string.Equals
aquí, no tiene nada de malo==
. En segundo lugar, también mencionaríaFirstOrDefault
(para los casos en que el elemento podría no estar allí), ySelect
con el índice para cubrir el caso donde se necesita el índice del elemento (como está en la muestra en la pregunta en sí).ArgumentNullException
si la fuente es nuloSi realmente
List<string>
no necesita LINQ, simplemente use:Si está buscando el artículo en sí, intente:
fuente
_list.Find(search)
para el segundo.¿Desea el elemento en la lista o el elemento en sí mismo (supondría el elemento en sí).
Aquí hay un montón de opciones para ti:
fuente
Este método es más fácil y seguro.
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
fuente
true : false
continuación debería funcionar igualbool insertOrderNew = lOrders.Find(r => r == "1234") == null;
¿Qué tal
IndexOf
?Por ejemplo
Tenga en cuenta que devuelve -1 si el valor no aparece en la lista
fuente
Solía usar un diccionario que es una especie de lista indexada que me dará exactamente lo que quiero cuando lo quiero.
Cada vez que deseo acceder a mis valores de márgenes, por ejemplo, dirijo mi diccionario:
Entonces, dependiendo de lo que esté haciendo, un diccionario puede ser útil.
fuente
Aquí hay una forma de reescribir su método para usar LINQ:
Por lo tanto, llamándolo con
GetItemIndex("two")
volverá1
,y
GetItemIndex("notthere")
devolverá-1
.Referencia: linqsamples.com
fuente
Prueba este código:
fuente
Si necesitamos encontrar un elemento de la lista, entonces podemos usar el método
Find
yFindAll
extensiones, pero hay una ligera diferencia entre ellos. Aquí hay un ejemplo.fuente
Esto lo ayudará a obtener el primer valor o el valor predeterminado en su búsqueda en la Lista de Linq
Esta búsqueda encontrará el primer valor predeterminado que devolverá.
fuente
Desea buscar un objeto en la lista de objetos.
Esto lo ayudará a obtener el primer valor o el valor predeterminado en su búsqueda en la Lista de Linq.
o
fuente
Puede usar FirstOfDefault con la extensión Where Linq para obtener una clase MessageAction de IEnumerable. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
dónde
Lista de acciones {get; conjunto; }
fuente