2013-02-15 43 views
1

我有一個結果從LINQ聲明,看起來像這樣回來:在數據的子集獲得的第一個值

Id dataId dataVal 
A 1  1000 
A 2  2000 
A 3  3000 
A 3  3001 
A 3  3002 

我想是剛纔得到的第一個項目(數據ID = 3和dataVal = 3000)

這裏是我的查詢時產生以上結果:

 var myIds = myList 
      .Where(a => ListIds.Contains(a.dataId)) 
      .Select(x=> new 
      { 
       Id = x.Id, 
       DataId = x.dataId, 
       DataValue = x.DataValue 
      }).ToList().Distinct(); 

我需要做一些分組或有更簡單的方法嗎?

+1

(dataVal - 3000)是如何「第一個」項目?你的意思是每個dataId的第一項? – 2013-02-15 18:56:24

+0

for dataId - 3 – webdad3 2013-02-15 18:57:03

+0

在選擇 – 2013-02-15 18:57:26

回答

3

集團的項目由dataId,然後從每組中選擇第一項:

var myIds = (from a in myList 
      where ListIds.Contains(a.dataId) 
      group a by a.dataId into g 
      let firstA = g.OrderBy(x => x.DataValue).First() 
      select new { 
       Id = firstA.Id, 
       DataId = g.Key, 
       DataValue = firstA.DataValue 
      }).ToList(); 

或用擴展方法(它返回原順序的第一項):

var myIds = myList 
     .Where(a => ListIds.Contains(a.dataId)) 
     .GroupBy(a => a.dataId) 
     .Select(g => new 
     { 
      Id = g.First().Id, 
      DataId = g.Key, 
      DataValue = g.First().DataValue 
     }).ToList(); 
+0

擴展方法更清晰。這是一個痛苦的閱讀:-) – 2013-02-15 19:01:19

+1

@Aniket好的,我會添加以前的版本:) – 2013-02-15 19:01:42

+1

謝謝:-)這是非常感謝! – 2013-02-15 19:02:05

1

使用.FirstOrDefault ()後選擇

var myIds = myList 
       .Where(a => ListIds.Contains(a.dataId)) 
       .Select(x=> new 
       { 
        Id = x.Id, 
        DataId = x.dataId, 
        DataValue = x.DataValue 
       }).FirstOrDefault(); 
+0

謝謝你。當我嘗試循環結果我的foreach語句錯誤。 – webdad3 2013-02-15 19:10:55