我在c#工作。我有一个排序的结构列表。该结构具有一个存储月份和年份的DateTime对象以及一个存储值的整数。该列表按日期排序。我需要遍历列表并将其组合起来,以便每个日期只有一个结构实例。
例如: 我的初始列表如下所示:
{ (Apr10, 3), (Apr10, 2), (Apr10, -3), (May10, 1), (May10, 1), (May10, -3), (Jun10, 3) }
结果列表应如下所示:
{ (Apr10, 2), (May10, -1), (Jun10, 3) }
我正在寻找一种简单/有效的解决方案。
结构是:
struct CurrentTrade
{
public DateTime date;
public int dwBuy;
}
列表是:
private List<CurrentTrade> FillList
答案 0 :(得分:6)
您可以使用LINQ:
var newList = (
from trade in FillList
group trade by trade.Date.Date into g
select new CurrentTrade { date = g.Key, dwBuy = g.Sum(t => t.dwBuy) }
).ToList();
答案 1 :(得分:2)
如果您不想使用LINQ:
如果列表按日期排序,则具有相同日期的所有项目彼此相邻。你可以这样做:
for ( int i = FillList.Count - 1; i >= 1; i-- ) {
if ( FillList[i].date == FillList[i-1].date ) {
FillList[i-1].dwBuy += FillList[i].dwBuy;
FillList.RemoveElementAt( i );
}
}
如果您的.NET支持,建议使用LINQ解决方案。
如果输入日期包含时间组件并且您想要在日期上合并,只需更改if语句:
if ( FillList[i].date == FillList[i-1].date )
到
if ( FillList[i].date.Date == FillList[i-1].date.Date )
答案 2 :(得分:1)
答案 3 :(得分:1)
var result = FillList.GroupBy(x => x.date)
.Select(g => new CurrentTrade {
date = g.Key,
dwBuy = g.Sum(x => x.dwBuy)
})
.ToList();
修改强>
如果CurrentTrade包含时间组件,则应将其转换为仅日期DateTime对象:
var result = FillList.GroupBy(x => x.date.Date)
.Select(g => new CurrentTrade {
date = g.Key,
dwBuy = g.Sum(x => x.dwBuy)
})
.ToList();
答案 4 :(得分:0)
使用HashSet<T>
怎么样? HashSet不能包含两次相同的对象。但是,您可能需要重新实施GetHash
课程中的CurrentTrade
方法。
(像return Date.GetHashCode() ^ dwBug
这样容易的事情可以做到。)