come verificare se l'elemento List <T> contiene un elemento con un valore di proprietà particolare


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

Come verificare se l'elemento di pricePublicListcontiene un determinato valore. Per essere più preciso, voglio verificare se esiste pricePublicModel.Size == 200? Inoltre, se questo elemento esiste, come sapere qual è?

MODIFICA Se Dictionary è più adatto a questo, potrei usare Dictionary, ma avrei bisogno di sapere come :)

Risposte:


186

Se si dispone di un elenco e si desidera sapere dove all'interno dell'elenco esiste un elemento che corrisponde a un determinato criterio, è possibile utilizzare il FindIndexmetodo dell'istanza. Ad esempio

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

Dov'è f => f.Bar == 17un predicato con i criteri di corrispondenza.

Nel tuo caso potresti scrivere

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

1
cosa succede se non conosco l'attributo di quel valore? ad esempio, ho un elemento della lista che mostra "18.00" non so da dove provenga, quindi voglio controllare quale attributo ha questo valore? quindi in pratica, e in modo simile a questo esempio non ho il .size o .bar voglio capirlo
Haithem KAROUI

cosa succede se l'elemento non esiste: quale sarà il valore dell'indice?
BKSpurgeon

8
NOTA: se l'elemento non esiste, findIndextornerà –1. Documentazione: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod

1
@tomloprod è per questo che cerca un indice maggiore o uguale a zero. se (indice> = 0). Potrebbe anche averlo scritto come se (indice> -1).
DannyC

127
bool contains = pricePublicList.Any(p => p.Size == 200);

6
Questo è strettamente per vedere se ne esiste uno.
Daniel A. White

3
Questo non risponde davvero alla domanda. Ha detto,how to know which one is it
George Johnston

15
Potrebbe non rispondere alla sua domanda, ma sicuramente mi ha aiutato, perché avevo bisogno di vedere se un oggetto con un dato nome esiste già nella mia collezione. Mi aspettavo un metodo .Contains migliorato, e questo è esattamente ciò che fa questa espressione LINQ. Grazie.
Igor

3
Risponde alla domanda nel titolo . OP spiega nella sua descrizione che in realtà non vuole esattamente ciò che ha detto di volere. Tuttavia, c'è uno di lui, e dozzine di noi trovano questa domanda tramite Google. Penso che sia più importante essere in grado di trovare la vera risposta alla sua domanda sul titolo.
MGOwen

5
Se qualcuno lo prova e .Any () non viene riconosciuto, è necessario aggiungerlo utilizzando System.Linq; all'inizio del file.
MGOwen

32

Puoi usare l'esistente

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

13

Questo è abbastanza facile da fare usando LINQ:

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

È possibile modificare direttamente l'elemento che corrisponde a questa condizione? Non prenderlo e riporlo in un nuovo oggetto, ma cambiarlo direttamente?
ilija veselica

Il matchvalore restituito può essere modificato (è l' PricePublicModeloggetto che era nell'elenco).
Jacob l'

Non dovresti modificare direttamente un oggetto che può essere nullo. Puoi sempre fare: match.Size = 300;o foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Tuttavia, non lo userei come una battuta.
Amy West

11

In realtà non c'è bisogno LINQ per questo, perché List<T>fornisce un metodo che fa esattamente ciò che si desidera: Find.

Cerca un elemento che soddisfi le condizioni definite dal predicato specificato e restituisce la prima occorrenza all'interno dell'intero List<T>.

Codice di esempio:

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.