2016-09-23 117 views
4

我有一個像使用LINQ選擇列表

 { 
     "Nutrients": [{ 
      "vitamin": "vitamin C", 
      "potassium": "195mg", 
      "sodium": "2mg", 
      "cholesterol": "", 
      "display_name": "Apple" 
     }, { 
      "vitamin": "vitamin B", 
      "potassium": "176mg", 
      "sodium": "2mg", 
      "cholesterol": "", 
      "display_name": "Grape" 
     }], 
     "General_name": "Fruits", 
     "country_of_origin": "France" 


    } 


    { 
     "Nutrients": [{ 
      "vitamin": "vitamin B", 
      "potassium": "196mg", 
      "sodium": "115mg", 
      "cholesterol": "123mg", 
      "display_name": "Chicken" 

     }, { 
      "vitamin": "vitamin B", 
      "potassium": "360mg", 
      "sodium": "53mg", 
      "cholesterol": "68mg", 
      "display_name": "Chicken" 
     }], 
     "General_name": "Meat", 
     "country_of_origin": "Denmark" 

    } 

名單,我需要找到具有膽固醇空字符串值項的General_name以外的項目。

我試圖使用LINQ lambda表達式作爲

var elements=items.SelectMany(c =>c.Nutrients) 
    .Where(a => !string.IsNullOrEmpty(a.cholesterol)) 
    .ToList(); 

我的問題是如何從這種情況

回答

5
var elements = items.Where(x => x.Nutrients.Any(a => !string.IsNullOrEmpty(a.cholesterol))) 
    .Select(x => x.GeneralName) 
    .ToList(); 

這將讓你所有的GeneralName值,其中的列表得到的總稱包含Nutrients集合包含一個非空值的膽固醇。那是你在找什麼?


編輯:

有沒有一種方法可以讓我得到這些項目的DISPLAY_NAME呢?

var elements = items.Where(x => x.Nutrients.Any(a => !string.IsNullOrEmpty(a.Cholesterol))) 
    .Select(x => new {x.GeneralName, DisplayNames = x.Nutrients.Where(a => !string.IsNullOrEmpty(a.Cholesterol)).Select(y => y.DisplayName).ToList()}) 
    .ToList(); 
+0

是的,我忘了布爾選項。感謝 – Mithun

+0

@Mithun - 很高興爲你工作。請考慮接受答案(請參閱[如何接受所​​有答案](http://meta.stackexchange.com/a/5235)),一旦過了15分鐘。 – Igor

+0

有沒有辦法讓我可以得到這些物品的display_name? – Mithun

0

以下是使用SelectMany你的原代碼的修改來實現相同的:

var elements = items.SelectMany(i => 
           i.nutrients.Select(n => new { n, i.CountryOfOrigin, i.GeneralName} 
          ).Where(h => !string.IsNullOrEmpty(h.n.cholesterol) 
          ).GroupBy(g => new { g.CountryOfOrigin, g.GeneralName } 
          ).Select(s => new Item { 
                 GeneralName = s.Key.GeneralName, 
                 CountryOfOrigin = s.Key.CountryOfOrigin, 
                 nutrients = s.Select(v => v.n).ToList() 
                } 
          ); 

說明:

  • 拼合使用選擇很多
  • 過濾器空Chloestrol項目
  • 的GroupBy使用GeneralNameCountryofOrigin,這是個別項目
  • 碎石GroupBy結果Items集合,用必要的值
  • 取任何財產從Result項目集合