2016-12-01 6 views
1

Ich habe die Liste orderList des Typs Order, die zwei Eigenschaften hat. Die Liste sieht ungefähr wie folgt aus.Entfernen von Elementen aus einer Liste basierend auf zwei Eigenschaften

Id  Status 
123  Good 
878  Good 
432  Good 
123  Void 

Was würde ich tun möchte, ist keine Aufträge zu entfernen, die einen Status haben, die Leere und jeder gute Aufträge ist, die die gleiche Id als nichtig Ordnung. Also das Ergebnis würde mir geben,

Id  Status 
878  Good 
432  Good 

Was ist der beste Weg, dies zu tun? Wird nur eine Liste von ungültigen Bestellungen mit linq abgerufen und dann diese neue Liste durchlaufen, um gute Bestellungen zu entfernen, die dieselbe ID haben?

+1

Ich wäre gut, wenn du zeigst, was du bisher hast;) – octavioccl

Antwort

1

können Sie Gruppe und später filtern und glätten die Gruppen am Ende:

var result= list.GroupBy(e=>e.Id) 
       .Where(g=>g.Any(r=>r.Status=="Good") && g.All(r=>r.Status!="Void")) 
       .SelectMany(g=>g); 
+1

Bist du sicher, dass das funktioniert? – mybirthname

+1

@mybirthname, oh ich sah gerade einen Fehler in meiner Lösung, danke, es ist bereits behoben – octavioccl

1

Sie müssen also Gruppe zuerst von Ihrem ID, nach, dass Ihre Daten angegeben und neues Feld zu entfernen, die wahr sein sollten wenn Sie einen Status Void in Ihrer Gruppenstatus-Sammlung haben. Danach nehmen Sie Objekte nur, wo die Remove falsch ist und am Ende erstellen Sie Ihre RootOrder.

var result = list.GroupBy(x => x.ID) 
      .Select(x => new { ID = x.Key, Status = x.FirstOrDefault().Status, Remove = x.Any(y => y.Status == "Void") }) 
      .Where(g => g.Remove == false) 
      .Select(r => new RootOrder { ID = r.ID, Status = r.Status }).ToList(); 

Vollcodebeispiel: dotNetFiddle

0

Eine Möglichkeit, die Gruppierung würde, Filterung und die restlichen Gruppen Abflachung - Wenn Sie eine ‚wörtliche‘ query möchten, können Sie versuchen, die folgenden Schritte aus:

erste Filter aus all dem nicht GoodOrders mit Where:

orderList = orderList.Where(x => x.Status == Status.Good) 

Dann herauszufiltern alle o F die verbleibenden Orders, für die es nicht GoodOrders in orderList denselben Id enthält und unter Verwendung von WhereAny:

.Where(x => !orderList 
    .Any(y => y.Status == Status.Void && y.Id == x.Id) 

Schließlich verwenden die ToList() die zurück IEnumerable als List zu nehmen:

orderList = orderList 
    .Where(x => x.Status == Status.Good) 
    .Where(x => !orderList 
     .Any(y => y.Status == Status.Void && y.Id == x.Id) 
    .ToList(); 
Verwandte Themen