cómo comprobar si el elemento List <T> contiene un elemento con un valor de propiedad particular

113
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 pricePublicListcontiene cierto valor. Para ser más preciso, quiero comprobar si existe pricePublicModel.Size == 200. Además, si este elemento existe, ¿cómo saber cuál es?

EDITAR Si el Diccionario es más adecuado para esto, entonces podría usar Diccionario, pero necesitaría saber cómo :)

ilija veselica
fuente

Respuestas:

186

Si tiene una lista y desea saber en qué parte de la lista existe un elemento que coincide con un criterio dado, puede usar el FindIndexmétodo de instancia. Como

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

Donde f => f.Bar == 17es un predicado con los criterios de coincidencia.

En tu caso podrías escribir

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}
Anthony Pegram
fuente
1
¿Qué pasa si no conozco el atributo de ese valor? por ejemplo, tengo un elemento de la 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 resolverlo
Haithem KAROUI
¿Qué pasa si el artículo no existe? ¿Cuál será el valor del índice?
BKSpurgeon
8
NOTA: Si el elemento no existe, findIndexregresará –1. Documentación: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod
1
@tomloprod es por eso que busca un índice mayor o igual a cero. si (índice> = 0). También podría haberlo escrito como si (índice> -1).
DannyC
127
bool contains = pricePublicList.Any(p => p.Size == 200);
Daniel A. White
fuente
6
Esto es estrictamente para ver si existe.
Daniel A. White
3
Esto realmente no responde a la pregunta. Él dijo:how to know which one is it
George Johnston
15
Puede que no responda a su pregunta, pero seguro que me ayudó, porque necesitaba ver si un objeto con un nombre de pila ya existe en mi colección. Esperaba un método .Contains mejorado, y esto es exactamente lo que hace esta expresión LINQ. Gracias.
Igor
3
Responde a la pregunta del título . OP explica en su descripción que realmente no quiere exactamente lo que dijo que quería. Aún así, hay uno de él y docenas de nosotros encontramos esta pregunta a través de Google. Creo que es más importante que podamos encontrar la respuesta real a la pregunta del título.
MGOwen
5
Si alguien intenta esto y .Any () no se reconoce, debe agregar usando System.Linq; en la parte superior de su archivo.
MGOwen
32

Puedes usar el existe

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}
Tiago
fuente
13

Esto es bastante fácil de hacer usando LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Jacob
fuente
¿Es posible editar directamente el elemento que coincide con esta condición? ¿No para obtenerlo y almacenarlo en un nuevo objeto, sino cambiarlo directamente?
ilija veselica
El matchvalor que se devuelve se puede modificar (es el PricePublicModelobjeto que estaba en la lista).
Jacob
No debe modificar directamente un objeto que puede ser nulo. Siempre puedes hacer: match.Size = 300;o foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Sin embargo, no lo usaría como una sola línea.
Amy West
11

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 aparición dentro de todo List<T>.

Código de ejemplo:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);
Mark Byers
fuente
4
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
}
Mahesh Velaga
fuente