C# linq marge重复值

C# linq marge重复值,c#,linq,list,C#,Linq,List,我有一个问题,但我不知道。。。。 我这里有一个名为list 促销的结构如下: new promotion() { string id, money amount, date startDate, date endDate } var promotions = new List<Promotion>(); promotions.Add(new Promotion { Id = 1, Amount = 2, StartDate = new DateTim

我有一个问题,但我不知道。。。。 我这里有一个名为
list
促销的结构如下:

new promotion()
{
    string id,
    money amount,
    date startDate,
    date endDate
}
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();
这个列表的很多元素是这样的

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}
所以我想将列表[0]和列表[1]合并在一起,但同时保留列表[2]和列表[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}
因为列表[0]和列表[1]具有相同的id,所以它们被合并。我想将金额加在一起,并保留startDate和endDate的较低日期时间。将列表[0]和列表[1]合并后成为列表[0]。列表[2]和列表[3]变成了列表[1]和列表[2]


有什么想法吗?谢谢大家!

您似乎正在寻找一个简单的分组查询,如下所示:

new promotion()
{
    string id,
    money amount,
    date startDate,
    date endDate
}
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();
var促销=新列表();
促销。添加(新促销{Id=1,金额=2,开始日期=新日期时间(2015,10,14),结束日期=新日期时间(2015,12,31)});
promotions.Add(新促销{Id=1,Amount=3,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,11,15)});
promotions.Add(新促销{Id=3,Amount=10,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,12,01)});
promotions.Add(新促销{Id=5,Amount=32,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,12,01)});
promotions=promotions.GroupBy(p=>p.Id)。选择(p=>new Promotion
{
Id=p.键,
金额=总金额(i=>i.Amount),
起始日期=p.Min(i=>i.StartDate),
EndDate=p.Min(i=>i.EndDate)
}).ToList();

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

new promotion()
{
    string id,
    money amount,
    date startDate,
    date endDate
}
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();
var促销=新列表();
促销。添加(新促销{Id=1,金额=2,开始日期=新日期时间(2015,10,14),结束日期=新日期时间(2015,12,31)});
promotions.Add(新促销{Id=1,Amount=3,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,11,15)});
promotions.Add(新促销{Id=3,Amount=10,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,12,01)});
promotions.Add(新促销{Id=5,Amount=32,StartDate=new DateTime(2015,11,01),EndDate=new DateTime(2015,12,01)});
promotions=promotions.GroupBy(p=>p.Id)。选择(p=>new Promotion
{
Id=p.键,
金额=总金额(i=>i.Amount),
起始日期=p.Min(i=>i.StartDate),
EndDate=p.Min(i=>i.EndDate)
}).ToList();

首先根据id对它们进行分组。然后根据规则为每个组选择一个新元素:

IEnumerable<promotion> merged = list.GroupBy(p => p.id)
  .Select(g => new Promotion
    {
      id = g.Key,
      amount = g.Sum(p => p.amount),
      startDate = g.Min(p => p.startDate),
      endDate = g.Min(p => p.endDate)
    };
IEnumerable merged=list.GroupBy(p=>p.id)
.选择(g=>新促销
{
id=g.键,
金额=总金额(p=>p金额),
起始日期=g.Min(p=>p.startDate),
endDate=g.Min(p=>p.endDate)
};

(请注意,小写属性和类名不是.Net中常用的约定。从技术上讲,这是可以的,但不是通常使用的样式)。

首先根据id对它们进行分组。然后根据规则为每个分组选择一个新元素:

IEnumerable<promotion> merged = list.GroupBy(p => p.id)
  .Select(g => new Promotion
    {
      id = g.Key,
      amount = g.Sum(p => p.amount),
      startDate = g.Min(p => p.startDate),
      endDate = g.Min(p => p.endDate)
    };
IEnumerable merged=list.GroupBy(p=>p.id)
.选择(g=>新促销
{
id=g.键,
金额=总金额(p=>p金额),
起始日期=g.Min(p=>p.startDate),
endDate=g.Min(p=>p.endDate)
};

(请注意,小写属性和类名不是.Net中常用的约定。从技术上讲,这是可以接受的,但不是通常使用的样式).

您应该多解释一点合并的标准。看起来像“合计金额”并采用最早开始日期和最早结束日期?您应该多解释一点合并的标准。看起来像“合计金额”并采用最早开始日期和最早结束日期?