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 :)

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
}

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);

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
}

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
}

¿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);

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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.