2011-10-25 8 views
5

Con una lista genérica, ¿cuál es la forma más rápida de verificar si existe un elemento con una determinada condición y, si existe, selecciónela, sin buscar dos veces en la lista:Comprobación del artículo en la Lista genérica antes de usarlo

Por ejemplo:

if (list.Exists(item => item == ...)) 
{ 
    item = list.Find(item => item == ...) 
    .... 
} 
+0

Haga la búsqueda. – dlev

+1

y si el elemento! = Null eres dorado –

Respuesta

5

O bien utilizar Find vez y comparar el resultado con default(T), o si default(T) podría ser el propio elemento, utilice FindIndex y comprobar si el índice es -1:

int index = list.FindIndex(x => x...); 
if (index != -1) 
{ 
    var item = list[index]; 
    // ... 
} 

Si está utilizando .NET 3.5 o superior, es más idiomática a utilizar LINQ - de nuevo, si default(T) no es un problema, usted podría utilizar algo como:

var item = list.FirstOrDefault(x => x....); 
if (item != null) 
{ 
    ... 
} 

El uso de LINQ le permitirá cambiar de List<T> a otras colecciones más adelante sin cambiar su código.

3

usted puede hacerlo simplemente con LINQ, sólo tiene que añadir el uso de System.Linq en la parte superior del espacio de nombres;

En primer lugar, si desea obtener todos los resultados:

var items = list.Where(item=>item.Id == giveID).ToList(); 

o si lo que desea es primer resultado;

var result = list.FirstOrDefault(item=>item.ID == givenID); 

en lugar de item.Id == givenID puede poner sus propios criterios. por ejemplo, si el artículo es una cadena que puede hacer item == "Test" o si es int hacer item == 5, ...

+0

No haría '.ToList()' de forma predeterminada. Esto te permite obtener ganancias de rendimiento. '.ToList()' te da una lista de los elementos encontrados, mientras que sin eso obtendrás un IEnumerator para recorrer los ítems. – Fischermaen

+0

@Fischermaen No haría eso, pero como veo que OP no está familiarizado con linq y la ejecución diferida causa ambigüedad, sugiero esto, al fin debe ejecutar el árbol de expresiones preparado, así que sin escribir en la lista, simplemente lo hace consulta y no obtuvo ningún IEnumerable (no se equivoque por lo que ve en el tiempo de compilación). Puede ejecutarlo cada vez que lo desee, pero debería hacerlo si lo desea. se puede hacer mediante el bucle foreach o todo lo demás –

5
item = list.Find(item => item == ...); 
if(null != item) 
{ 
    //do whatever you want 
} 
+1

Tenga en cuenta que esto no funciona si 'null' es un valor válido que podría estar buscando. Tampoco funciona para 'List ', etc. También tenga en cuenta que no es necesario utilizar el enfoque de "constante primero" en condiciones en C#, excepto en situaciones en las que se comprueba explícitamente la igualdad con valores 'bool'. –

+0

Sí y gracias, tienes razón. Pero no entiendo tu segundo punto ¿qué diferencia hace null! = Item and item! = Null makes? –

Cuestiones relacionadas