2014-11-14 36 views
0

對不起,標題有點含糊,想不到一個好的。如何獲取相應值更改的行值 - LINQ

我有一個對象列表,它包含一些最大和最小極限值以及一個時間戳。

爲了說明這一點,我的網格用於顯示列表的內容可能是這樣的(很簡單):

LimitMin | LimitMax | Start Time 
1   2  08:00 
1   2  08:01 
1   2  08:03 
2   5  08:05 
2   5  08:06 
2   5  08:10 

現在,我只是做一個選擇不同,得到不同的限制和補充他們到一個列表,像這樣:

var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct(); 

但我想獲得的時間戳,以及,在限制改變(在本例中08:05以上)。我似乎無法弄清楚,如何做到這一點。我想到了Distinct實際上是如何在幕後工作的,如果你能以某種方式從select語句中獲得時間戳。我是否必須通過foreach循環遍歷整個列表,然後比較這些值以查看其更改的位置?

任何幫助?

回答

1

這裏的技巧是使用而不是鮮明的GroupBy。然後,您既可以得到每個限制對最小時間戳:

items 
    .GroupBy(x => new { x.LimitMin, x.LimitMax }) 
    .Select(x => new { 
     x.Key.LimitMin, 
     x.Key.LimitMax, 
     MinStartTime = x.Min(y => y.StartTime) 
    }); 

,或者作爲的GroupBy保留原始項目的順序,得到每個第一時間標記:

items 
    .GroupBy(x => new { x.LimitMin, x.LimitMax }) 
    .Select(x => new { 
     x.Key.LimitMin, 
     x.Key.LimitMax, 
     FirstStartTime = x.First().StartTime 
    }); 
+0

決定去你的第一個建議,它的作品就像一個魅力。非常感謝! – St0ffer 2014-11-14 13:37:59

0

一種解決方案將是組由最小/最大,然後由起始時間順序最後選擇所述第一時間值:

var list = new List<Foo> 
{ 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:00") }, 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:01") }, 
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:03") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:05") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:06") }, 
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:10") }, 
}; 

var tmp = list 
    .GroupBy(z => new { z.LimitMin, z.LimitMax }) 
    .Select(z => 
     new 
     { 
      Time = z.OrderBy(z2 => z2.StartTime).First().StartTime, 
      Min = z.Key.LimitMin, 
      Max = z.Key.LimitMax 
     }) 
    .ToList(); 
1

試試這個: -

var limitdistinct = printIDSPC.GroupBy(x => new { x.LimitMax, x.LimitMin }) 
             .Select(x => new 
              { 
               LimitMin = x.Key.LimitMin, 
               LimitMax = x.Key.LimitMax, 
               MinTime = x.OrderBy(y => y.StartTime).First().StartTime 
              }); 

Fiddle

相關問題