2011-02-08 20 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>(); 

Come verificare se elemento di pricePublicList contiene certo valore. Per essere più precisi, voglio verificare se esiste pricePublicModel.Size == 200? Inoltre, se questo elemento esiste, come sapere qual è?come verificare se Lista <T> elemento contiene un elemento con un valore particolare proprietà

EDIT Se dizionario è più adatto per questo poi ho potuto utilizzare il dizionario, ma avrei bisogno di sapere come :)

risposta

152

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 metodo di istanza FindIndex. Come

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

Dove f => f.Bar == 17 è un predicato con i coincidenti.

Nel tuo caso si potrebbe scrivere

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

cosa succede se non conosco l'attributo di quel valore? per esempio. Ho una voce di elenco che sta visualizzando "18.00 "non so da dove viene, quindi voglio verificare quale attributo ha questo valore? Quindi in pratica, e similiramente a questo esempio non ho il .size o .bar voglio capirlo –

+0

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

+2

** NOTA: ** Se l'elemento non esiste, 'findIndex' restituirà' -1'. Documentazione: https://msdn.microsoft. it/es-es/library/x1xzf2ca (v = vs.110) .aspx – tomloprod

12

Questo è abbastanza facile da fare utilizzando LINQ:

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

E 'possibile modificare direttamente l'elemento che corrisponde a questa condizione? Non prenderlo e archiviarlo in un nuovo oggetto, ma cambiare direttamente? –

+0

Il valore 'match' che viene restituito può essere modificato (è l'oggetto' PricePublicModel' presente nell'elenco). – Jacob

+0

Non 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;'. Non lo userei come un solitario me stesso, però. –

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

Questo è strettamente per vedere se ne esiste uno. –

+3

Questo in realtà non risponde alla domanda. Ha detto, 'come sapere quale è Liechtenstein attua –

+7

Potrebbe non rispondere alla sua domanda, ma sicuramente ha fatto aiutarmi, perché avevo bisogno di vedere se un oggetto con un determinato nome esiste già nella mia collezione. Mi aspettavo un metodo .Contains migliorato - e questo è esattamente ciò che fa questa espressione LINQ. Grazie. – 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

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 corrisponde alle condizioni definite dal predicato specificato e restituisce la prima occorrenza nell'intero List<T>.

codice Esempio:

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

È possibile utilizzare il esiste

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