2011-09-16 117 views
3

一組查詢我有2種類型:遇到問題表達LINQ

public class TimedValue 
{ 
    public DateTime TimeStamp { get; set; } 
    public double Value { get; set; } 
} 

public class Stats 
{ 
    IList<TimedValue> Values { get; set; } 
    ... // some other fields 
} 

統計的多個實例存儲在一個IEnumerable集合對象。我試圖想出一個LINQ查詢,它會給我所有Stats實例的按時間順序的Value總數。這意味着它會經歷每個Stats對象中的每個TimedValue,並且如果它們的TimeStamps匹配,它將添加Value字段。所以最後我會得到一份按時間順序排列(從最舊到最新)的雙打名單。

在LINQ方面很弱,我在這方面失敗了。我只得到儘可能做到:

.Select(stat => stat.Values) 

要向下投射到:

List<List<Value>> 

這是統計對象,我需要的子集,但我無法弄清楚如何組我需要的總值。

例子(因爲有一些混亂,我的意思):

假設我們有一個統計數據的2個實例,我在這裏簡化符號,只是爲了讓例子短:

Stats1 :值= {{「Monday」,1.1},{「Tuesday」,2.2}}
Stats2:Values = {{「Monday」,1.1},{「Tuesday」,2.2},{「Friday」 3.3}}

結果應該是雙打列表:{2.2,4.4 ,3.3}

+2

這是LINQ的真棒資源。 http://msdn.microsoft.com/en-us/vcsharp/aa336746 –

+0

您是否想要把它們都在一個單獨的列表,如清單或你想要值的每個子列表是一個聚合值某種如平均時間戳和平均值? –

+0

增加了一個例子來澄清所需的最終結果。 –

回答

3

這應該給你包含的款項雙打名單:

statList.SelectMany(stat => stat.Values) 
     .GroupBy(x => x.TimeStamp) 
     .OrderBy(g => g.Key) 
     .Select(g => g.Sum(x => x.Value)); 
     .ToList(); 

如果你不想的款項(在這個問題不是完全清楚的),這將給你剛剛名單分組:

var timeStampGroups = statList.SelectMany(stat => stat.Values) 
           .GroupBy(x => x.TimeStamp) 
           .OrderBy(g => g.Key) 
           .ToList(); 
+0

用一個例子更新了我的問題。 –

+0

@Alex K:第一個解決方案應該適合你 – BrokenGlass

0

更新爲請求返回雙打的名單。

這應該做的伎倆:

var values = (from stat in statsCollection 
       from value in stat.Values 
       //group the values by the timestamp 
       group value by value.TimeStamp into grouping 
       orderby grouping.Key 
       select grouping.Sum(v => v.Value)).ToList(); 

下面是輸出:

output