2017-10-18 66 views
0

我有一个存储列表实例的列表。我想从与IdName子列表中删除对象==“149”删除列表中的列表

 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(); 

我可以删除整个序列,但如何从序列中删除一个元素?

回答

2

使用Remove()删除给定项目,或使用RemoveAt()删除给定位置的项目。

0

我认为,你比它需要更复杂。您只需循环所有的ChTypesList并删除不需要的ChType。它可以通过下面的代码很容易地完成

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

你所有的LINQ线prpr0pr1pr.Select().ToList().RemoveAll()都是不必要的。此外,在您当前的代码中,您仅拾取CHType与​​,不确定这是错误还是代码正确,但是您的问题未能指定。下面

由于OP坚持避免foreach是做

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

非常感谢你的一个LINQ方式,但所有的兴趣是LINQ。使用循环,这很容易做 – Tibomso

+0

@Tibomso你能解释为什么你需要使用'LINQ'从嵌套列表中删除元素吗? 'LINQ'通常用于提取(认为select in sql)信息,而不是改变它们。 – Vikhram