2017-07-31 74 views
1

我仍然沒有很好地理解LINQ,並且覺得我的代碼可以優化以便尋找幫助。 貝婁是我的模型Linq查詢過濾掉列表中的列表而不使用刪除

class entity 
{ 
    public string id { get; set; } 
    public string catagory { get; set; } 
    public IList<details> info{ get; set;} 
} 
class details 
{ 
    public string id{ get; set; } 
    public string name { get; set; } 
    public string locale { get; set; } 
} 

List<entity> list = new List<entity>(); 
list.Add(new entity { id = "1", catagory = "cat1", info = new { locale = "en", name = "d1" }, { locale = "fr", name = "d2" } }); 
list.Add(new entity { id = "2", catagory = "cat2", info = new { locale = "en", name = "d3" }}); 

需要根據區域過濾掉,假設我需要得到唯一場所=「EN」名單。在JSON

模型清晰

 { 
     "id": "1", 
     "catagory": "cat1", 
     "info": [{"locale":"en","name":"d1"},{"locale":"fr","name":"d1"}] 
    }, 
    { 
     "id": "2", 
     "catagory": "cat2", 
     "info": [{"locale":"en","name":"d3"}] 
    } 

預期的結果 - 只有locale =「en」

 { 
     "id": "1", 
     "catagory": "cat1", 
     "info": [{"locale":"en","name":"d1"}] 
    }, 
    { 
     "id": "2", 
     "catagory": "cat2", 
     "info": [{"locale":"en","name":"d3"}] 
    }` 

回答

1

LINQ的唯一的解決辦法是:

var result = list.Select(item => new entity 
     { 
      id = item.id, 
      catagory = item.catagory, 
      info = item.info.Where(inner => inner.locale == "en").ToList() 
     }); 

如果您不希望項目新entry細節然後使用一個foreach循環,並在其中的每個項目只保留details匹配:

foreach (var item in list) 
{ 
    item.info = item.info.Where(inner => inner.locale == "en").ToList(); 
} 

請注意,你的類不遵循C#的命名約定:

+0

@mohd - 高興它幫助你,並且解決了感謝標記:) –

0

試試這個...希望它能幫助你(f也ixed你的一些代碼):

class entity 
     { 
      public string id { get; set; } 
      public string catagory { get; set; } 
      public IList<details> info { get; set; } 
     } 
     class details 
     { 
      public string id { get; set; } 
      public string name { get; set; } 
      public string locale { get; set; } 
     } 

List<entity> list = new List<entity>(); 
      list.Add(new entity { id = "1", catagory = "cat1", info = new List<details> { new details { locale = "en", name = "d1" }, new details { locale = "fr", name = "d2" } } }); 
      list.Add(new entity { id = "2", catagory = "cat2", info = new List<details> { new details { locale = "en", name = "d3" } } }); 

      var result = list.Where(xx => xx.info.Any(yy => yy.locale == ""));