2015-12-30 19 views
5

Ho una lista di foo chiamata crepes. Voglio tornare foo dove bar.doritos == "coolRanch"Linq query a Elenco di oggetti contenenti un elenco di oggetti

class foo 
{ 
    List<bar> item; 
    string candy; 
    string beer; 
} 

class bar 
{ 
    string doritos; 
    string usb; 
} 

var item = crepes.item.Where(x => x.doritos == "coolRanch").FirstOrDefault(); 

Da altri thread, ho messo insieme la query LINQ sopra, ma crepes.item genera un errore. "Lista non contiene una definizione per 'voce' e nessuna definizione di 'voce' accettare primo argomento ...

+1

I campi in 'C#' sono * privati ​​per impostazione predefinita *. Cambia la tua dichiarazione in 'item pubblico item;' – Rob

+0

sia la classe che il puntello sono pubblici. Hai ancora ricevuto l'errore, il mio linq è corretto? – Chris

risposta

11

Dato che crepes è un List<Foo>, è necessario aggiungere un ulteriore livello alla query linq.

var item = crepes.Where(a => a.item.Any(x => x.doritos == "coolRanch")).FirstOrDefault(); 
3

tuo itemaccess modifier è private (questo è C# default per class), dovrebbe essere reso public

questo vale per il vostro doritos troppo

inoltre, dal momento che il vostro è un crepesList, mettere ulteriore strato di LINQ (come suggerito anche da altri) per risolvere completamente, qualcosa di simile

var item = crepes.Where(f => f.item.Any(b => b.doritos == "coolRanch")).FirstOrDefault(); //f is of foo type, b is of bar type 
+0

sia la classe che il puntello sono pubblici. Hai ancora ricevuto l'errore, il mio linq è corretto? – Chris

+0

@Chris Che errore produce ora? Penso che dovresti cambiare anche i tuoi 'doritos' – Ian

2

Se si fissa le vostre classi come questo

class Foo 
{ 
    public List<Bar> Items { get; set; } 
    public string Candy { get; set; } 
    public string Beer { get; set; } 
} 

class Bar 
{ 
    public string Doritos { get; set; } 
    public string Usb { get; set; } 
} 

Vostri criteri sarà simile

var crepes = new List<Foo>(); 
var item = crepes.FirstOrDefault(f => f.Items.Any(b => b.Doritos == "coolRanch")); 

Qui, stiamo cercando di ottenere il primo Foo, che ha almeno un Bar in Items dove Doritos == "coolRanch".

Problemi correlati