2017-10-18 2 views
0

Ich habe eine Liste, die eine Instanz der Liste speichert. Ich möchte das Objekt aus der Teilliste mit IdName == „149“Liste in Liste entfernen

 List<Product> productList = new List<Product>() 
     { 
      new Product() 
      { 
       Id = 1, 
       Model = "Phone", 
       TypeProd = new CheckTypes() { ChTypes = new List<CHType> { new CHType() { Id = 8, IdName = "261"}, new CHType() {Id = 9 , IdName = "149" } } } 

      }, 
      new Product() 
      { 
       Id = 1, 
       Model = "Printer", 
       TypeProd = new CheckTypes() { ChTypes = new List<CHType> { new CHType() { Id = 8, IdName = null}, new CHType() {Id = 8 , IdName = "261" } } } 
      } 
     }; 

     var pr = productList.Select(s => s.TypeProd).Where(w => w.ChTypes.Any(a => a.IdName != null && a.IdName.Contains("149"))).ToList(); 
     // I 
     var pr0 = pr.Select(s => s.ChTypes).Where(w => w.Any(a => a.Id == 9)).ToList(); 
     // II 
     var pr1 = pr.Select(s => s.ChTypes).Except(pr0); 
     // III 
     pr.Select(s=>s.ChTypes).ToList().RemoveAll(a => a.Any(item => item.IdName.Contains("149"))); 
     foreach (var item in pr) 
     { 
      foreach (var item2 in item.ChTypes) 
      { 
       Console.WriteLine(item2.IdName); 
      } 

      Console.WriteLine("End"); 
     } 

     Console.ReadKey(); 

ich die ganzen Sequenz löschen erhalten entfernen, aber wie ein Element aus der Sequenz löschen?

Antwort

2

Verwenden Sie Remove(), um ein bestimmtes Objekt zu entfernen, oder verwenden Sie RemoveAt(), um das Objekt an einem bestimmten Ort zu entfernen.

0

Ich denke, Sie verkomplizieren es mehr als es sein muss. Sie müssen einfach alle ChTypesList Schleife und entfernen Sie die unerwünschte ChType. Es kann leicht durch den folgenden Code

foreach (var chType in productList.Select(prod => prod.TypeProd.ChTypes)) 
    chType.RemoveAll(c => c.IdName != null && c.IdName.Contains("149")); 

Alle Ihre LINQ Linien für pr, pr0, pr1 und pr.Select().ToList().RemoveAll() sind alle nicht benötigten erreicht werden. Außerdem, in Ihrem aktuellen Code abholen Sie nur CHType mit Id = 9, nicht sicher, ob das aus Versehen oder Ihr Code korrekt ist, aber Ihre Frage nicht angegeben.

Da die OP besteht foreach unten zu vermeiden, ist ein ein schlechtLINQ Art und Weise tun

productList.Select(prod => prod.TypeProd.ChTypes) 
      .Select(chType => chType.RemoveAll(c => c.IdName != null && c.IdName.Contains("149"))) 
      .ToList(); 
+0

danke sehr viel, aber alles Interesse ist in Linq. Mit einem Zyklus ist dies einfach zu tun – Tibomso

+0

@Tibomso Können Sie erklären, warum Sie 'LINQ' verwenden müssen, um Elemente aus einer verschachtelten Liste zu entfernen? 'LINQ' wird normalerweise verwendet, um Informationen zu extrahieren (think select in sql) und nicht zu mutieren. – Vikhram