2011-02-08 17 views
85
public class PricePublicModel 
{ 
    public PricePublicModel() { } 

    public int PriceGroupID { get; set; } 
    public double Size { get; set; } 
    public double Size2 { get; set; } 
    public int[] PrintType { get; set; } 
    public double[] Price { get; set; } 
} 

List<PricePublicModel> pricePublicList = new List<PricePublicModel>(); 

Cómo comprobar si el elemento de pricePublicList contiene cierto valor. Para ser más precisos, quiero verificar si existe pricePublicModel.Size == 200? Además, si este elemento existe, ¿cómo saber cuál es?cómo comprobar si la lista <T> elemento contiene un elemento con un particular Propiedad Valor

EDITAR Si diccionario es más adecuado para esto, entonces yo podría utilizar el diccionario, pero yo tendría que saber cómo :)

Respuesta

152

Si tiene una lista y desea saber en qué lugar de la lista existe un elemento que coincida con un criterio determinado, puede utilizar el método de instancia FindIndex. Tal como

int index = list.FindIndex(f => f.Bar == 17); 

Dónde f => f.Bar == 17 es un predicado con los criterios de coincidencia.

En su caso, usted podría escribir

int index = pricePublicList.FindIndex(item => item.Size == 200); 
if (index >= 0) 
{ 
    // element exists, do what you need 
} 
+0

¿Qué sucede si no conozco el atributo de ese valor? p.ej. Tengo un elemento de lista que muestra "18.00 "no sé de dónde viene, así que quiero comprobar qué atributo tiene este valor? Así que, básicamente, y de manera similar a este ejemplo no tengo el .size o .bar quiero averiguarlo –

+0

qué si el artículo no existe: ¿cuál será el valor del índice? – BKSpurgeon

+2

** NOTA: ** Si el elemento no existe, 'findIndex' devolverá' -1'. Documentación: https://msdn.microsoft. com/es-es/library/x1xzf2ca (v = vs.110) .aspx – tomloprod

12

Esto es bastante fácil de hacer uso de LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200); 
if (match == null) 
{ 
    // Element doesn't exist 
} 
+0

¿Es posible editar directamente el elemento que cumpla esta condición? No para obtenerlo y almacenarlo en un objeto nuevo, ¿pero cambiarlo directamente? –

+0

El valor 'match' que se devuelve se puede modificar (es el objeto' PricePublicModel' que estaba en la lista). – Jacob

+0

No debe modificar directamente un objeto que puede ser nulo. Siempre puede hacer: 'match.Size = 300;' o 'foreach (var item en pricePublicList.Where (p => p.Size == 200)) item.Size = 300;'. Sin embargo, no lo usaría como un trazador de líneas. –

90
bool contains = pricePublicList.Any(p => p.Size == 200); 
+5

Esto es estrictamente para ver si existe. –

+3

Esto realmente no responde la pregunta. Dijo: "cómo saber cuál es" –

+7

Puede que no responda su pregunta, pero seguro que me ayudó, porque necesitaba ver si un objeto con un nombre ya existe en mi colección. Esperaba un .Contains-method mejorado, y esto es exactamente lo que hace esta expresión LINQ. Gracias. – Igor

3
var item = pricePublicList.FirstOrDefault(x => x.Size == 200); 
if (item != null) { 
    // There exists one with size 200 and is stored in item now 
} 
else { 
    // There is no PricePublicModel with size 200 
} 
9

En realidad no necesita LINQ para esto porque List<T> proporciona un método que hace exactamente lo que quiere: Find.

Busca un elemento que coincida con las condiciones definidas por el predicado especificado y devuelve la primera ocurrencia dentro de List<T>.

código Ejemplo:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200); 
16

Puede usar el existe

if (pricePublicList.Exists(x => x.Size == 200)) 
{ 
    //code 
} 
Cuestiones relacionadas