我试图找到一种使用LINQ对列表进行分组的方法,不仅仅是Foo对象的属性(EmployeeId,CompanyId和GroupId),而且只有在Baz对象的StartDate和EndDate属性准确的情况下才对它们进行分组。相同。目标是按EmployeeId,CompanyId和GroupId进行分组,并将Bars集合组合为所有分组记录的集合。
因此,如果List有三个对象,并且第一个对象上的Bars集合都是BazId = 1,第二个BazId = 2,第三个BazId = 3,我会期望一个结果,其中List包含两个对象,一个带有一个Bars BazIds为1和3的集合以及另一个具有BazIds为2的Bars集合的集合(因为1和3具有相同的开始/结束日期,如下所述)。
我希望这是有道理的。我已经醒了很长时间,如果不清楚,请告诉我,我会尽力澄清。
到目前为止我所拥有的是:
var result = foos.GroupBy(g => new { g.CompanyId, g.EmployeeId, g.GroupId })
.Select(g => new Foo(g.Key.CompanyId, g.Key.EmployeeId, g.Key.GroupId)
{
Bars = g.SelectMany(x => x.Bars)}
).ToList();
但是,这会忽略相应Baz对象的StartDate / EndDate属性。我只想对其集合中具有共享相同开始/结束日期的BazId的Foo对象的记录进行分组。
编辑:给定Bars集合中的所有Bar对象都具有相同的BazId
是一项业务规则public class Foo {
public int EmployeeId { get; set; }
public int CompanyId { get; set;
public int GroupId { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar {
public BazId { get; set; }
public string Name { get; set; }
}
public class Baz {
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
var baz = new List<Baz> {
new Baz {
Id = 1,
StartDate = DateTime.Now,
EndDate = DateTime.Now.AddMonths(1)
},
new Baz {
Id = 2,
StartDate = DateTime.Now.AddMonths(-1),
EndDate = DateTime.Now.AddMonths(1)
},
new Baz {
Id = 3,
StartDate = DateTime.Now,
EndDate = DateTime.Now.AddMonths(1)
},
}
解 根据@jdweng的评论
,我最终得到的是这个var result = foos.GroupBy(g => g, new FooComparer())
.Select(g => new Foo(g.Key.CompanyId, g.Key.EmployeeId, g.Key.GroupId)
{
Bars = g.SelectMany(x => x.Bars)}
).ToList();
在FooComparer
内,我实施了IEqualityComparer<Foo>
并创建了Equals
和GetHashCode
方法,通过检查Baz
的{{1}}个集合来确定这两个方法是否相等每个
答案 0 :(得分:1)
您似乎必须将开始日期和结束日期分组。为此你必须加入Baz。
---
my-array: <%= my_data_file %>
---
答案 1 :(得分:1)
尝试使用CompareTo()方法将继承添加到IComparable类。 Linq Groupby将使用CompareTo方法进行分组