linq marge重复值

时间:2015-11-19 01:37:46

标签: c# linq list

我得到一个问题并且不知道它...... 我这里有一个名为list<Promotion>的列表 促销的结构是这样的:

new promotion()
{
    string id,
    money amount,
    date startDate,
    date endDate
}

此列表中的许多元素都是这样的,

list[0] = {id =1, amount = 2, startDate = 2015-10-14, endDate= 2015-12-31}
list[1] = {id =1, amount = 3, startDate = 2015-11-01, endDate= 2015-11-15}
list[2] = {id =3, amount = 10, startDate = 2015-11-01, endDate= 2015-12-01}
list[3] = {id =5, amount = 32, startDate = 2015-11-01, endDate= 2015-12-01}

所以我想将list [0]和list [1]合并在一起,但也保留list [2]和list [3],结果将是这样的

list[0] = {id =1, amount = 5, startDate = 2015-10-14, endDate= 2015-11-15}
list[1] = {id =3, amount = 10, startDate = 2015-11-01, endDate= 2015-12-01}
list[2] = {id =5, amount = 32, startDate = 2015-11-01, endDate= 2015-12-01}

因为list [0]和list [1]具有相同的id,所以它们被合并。我想一起添加金额,并保持startDate和endDate的较低日期时间。合并列表[0]和列表[1]后变为列表[0]。列表[2]和列表[3]成为列表[1]和列表[2]

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您似乎正在通过查询寻找一个简单的组:

var promotions = new List<Promotion>();
promotions.Add(new Promotion { Id = 1, Amount = 2, StartDate = new DateTime(2015, 10, 14), EndDate = new DateTime(2015, 12, 31) });
promotions.Add(new Promotion { Id = 1, Amount = 3, StartDate = new DateTime(2015, 11, 01), EndDate = new DateTime(2015, 11, 15) });
promotions.Add(new Promotion { Id = 3, Amount = 10, StartDate = new DateTime(2015, 11, 01), EndDate = new DateTime(2015, 12, 01) });
promotions.Add(new Promotion { Id = 5, Amount = 32, StartDate = new DateTime(2015, 11, 01), EndDate = new DateTime(2015, 12, 01) });

promotions = promotions.GroupBy(p => p.Id).Select(p => new Promotion
    {
        Id = p.Key,
        Amount = p.Sum(i => i.Amount),
        StartDate = p.Min(i => i.StartDate),
        EndDate = p.Min(i => i.EndDate)
}).ToList();

答案 1 :(得分:3)

首先按ID分组。然后,对于每个组,根据您的规则选择一个新元素:

../include

(请注意,小写属性和类名称不是.Net中通常的惯例。它在技术上很好,但不是通常使用的样式。)