2015-11-18 7 views
5

ich eine Struktur wie dieses:Where-Klausel in Linq in List C#

struct Test 
{ 
    string name; 
    string family; 
    public Test... 
} 

in meinem Code habe ich eine Liste dieser Struktur:

List<Test> testList=new List<Test>(); 

ich eine Linq-Ausdruck wie folgt aussehen:

var list =testList.Select(n=>n.Name); 

aber wie kann ich diese Auswahl nach Familie der Testliste filtern? so etwas wie diese:

var list=testList.Select(n=>n.Name).Where(f=>f.Family==""); 

dieses Where-Klausel nur auf ausgewählte Namen anzuwenden, die eine Liste von Zeichenfolge sind

Irgendwelche Ideen, wie das zu tun?

+0

Entfernen Sie den 'Select'. –

+1

Oder verschieben Sie es nach dem 'Where'. –

Antwort

9

Einfach den Where vor dem Select:

var list=testList.Where(f=>f.Family=="").Select(n=>n.Name); 

In Linq Sie den Filter vor Projizieren (es sei denn, der Filter gilt für die Ergebnisse der Projektion statt der ursprünglichen Sammlung) anwenden müssen.

4

Filtern Sie mit Where, bevor Sie nur eine Eigenschaft mit Select auswählen. Auf diesen Weisen Sie noch das volle Objekt erhalten:

testList.Where(t => t.Family == "").Select(t => t.Name) 

Immerhin nehmen Select das Objekt und dann passiert nur auf, was Sie in dem Lambda zurück. In diesem Fall geben Sie nur eine Zeichenfolge zurück, sodass Sie alle anderen Informationen aus dem Objekt Test wegwerfen. Daher sind die Informationen, die Sie filtern möchten, nicht mehr verfügbar.

Wenn Sie das umschalten, können Sie nach dem Testobjekt filtern und dann nur diese eine Zeichenfolge zurückgeben.

1

Normalerweise, wenn ich nach einem leeren Wert wie diesem suche, verwende ich string.IsNullOrEmpty(), nur für den Fall.

testList.Where(f=> string.IsNullOrEmpty(f.Family)).Select(n=>n.Name);