[英]LINQ: Grouping By and Selecting from a List of objects based on max value
我有MyItem類有3個屬性如下:
class MyItem
{
private string _name;
private int _value
private DateTime _TimeStamp;
public MyItem(string name, int value, string timeStamp)
{
this._name = name;
this._value = value;
this._timeStamp = DateTime.Parse(timeStamp);
}
public string Name
{ get {return this_name; } }
public int Value
{ get {return this._value; } }
public DateTime TimeStamp
{ get {return this._timeStamp; } }
// ...
}
我也有一個MyItem列表如下:
var myItems = new List<MyItem>() {
new MyItem("A", 123, "23/02/2012"),
new MyItem("A", 323, "22/02/2012"),
new MyItem("B", 432, "23/02/2012"),
new MyItem("B", 356, "22/02/2012"),
// ...
}
我如何GROUP BY myList,以便我只剩下具有Maximum TimeStamp的項目? 即結果如下:
"A" 123 23/02/2012<br>
"B" 432 23/02/2012<br>
提前致謝。
myItems.GroupBy(item => item.Name)
.Select(grp => grp.Aggregate((max, cur) =>
(max == null || cur.Date > max.Date) ? cur : max))
這將在盡可能最快的時間內(至少我可以計算)選擇您的結果,而無需創建新對象並以最少的次數迭代集合。
從組中選擇最大值:
from item in MyItems
group item by item.Name into grouped
let maxTimeStamp = grouped.Max(i => i.TimeStamp)
select grouped.First(i => i.TimeStamp == maxTimeStamp)
var temp = myItems.Where(x => x.TimeStamp == myItems.Where(y => y.Name == x.Name).Max(z => z.TimeStamp)).Distinct().ToList();
var tmp = select i from myItems
group i by i.Name into g
select new MyItem
{
g.Name,
Value = g.OrderByDescending(x => x.Timestamp).First().Value,
Timestamp = g.Max(x => x.Timestamp)
};
好的,我通過在類中添加一個空構造函數來改變你的類MyItem
以獲得一些LINQ方便(希望這不會導致問題):
public MyItem() { }
在示例控制台程序中,此代碼將起作用:
static void Main(string[] args)
{
var myItems = new List<MyItem>()
{
new MyItem("A", 123, "23/02/2012"),
new MyItem("A", 323, "22/02/2012"),
new MyItem("B", 432, "23/02/2012"),
new MyItem("B", 356, "22/02/2012")
// ...
};
var grouped = from m in myItems
group m by m.Name into g
let maxTimestamp = g.Max(t => t.TimeStamp)
select new MyItem
{
Name = g.Key,
Value = g.First(f => f.TimeStamp == maxTimestamp).Value,
TimeStamp = maxTimestamp
};
foreach (var gItem in grouped)
{
Console.WriteLine(gItem.Name + ", " + gItem.Value + ", " + gItem.TimeStamp);
}
Console.ReadLine();
}
輸出符合您的預期結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.