如何组合列表的元素

时间:2010-03-08 22:35:46

标签: c# algorithm list arraylist

我在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

5 个答案:

答案 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)

请看LINQ statements

答案 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这样容易的事情可以做到。)