我有一个类似于
的类的列表public class MyClass
{
public ComplexType A {get;set;}
public ComplexTypeB B {get;set;}
}
var myList = new List<MyClass>();
然后我有一个目标Dto,看起来像这样
public class MyTargetDto
{
public ComplexType A {get;set;}
public List<ComplexTypeB> ListOfB {get;set;}
}
只有myTargetDto支持ComplexType分组
才非常相似鉴于MyClass的平面列表,我如何(使用Linq)将其转换为MyTargetDto的目标列表?
答案 0 :(得分:1)
你应该这样做。
myList.GroupBy(x=>x.A)
.Select(x=> new MyTargetDto()
{
A= x.Key,
ListOfB = x.Select(s=>s.B).ToList()
});
答案 1 :(得分:0)
myList.GroupBy(item => item.A)
.Select(group => new MyTargetDto
{
A = group.Key,
ListOfB = group.Select(item => item.B).ToList()
});
答案 2 :(得分:0)
如果您的ComplexType
没有自己的Equals
实施,那么您需要实施IEqualityComparer<ComplexType>
:
public class Comparer : IEqualityComparer<ComplexType>
{
public bool Equals(ComplexType x, ComplexType y)
{
// code to check your complex type for equality
}
public int GetHashCode(ComplexType obj)
{
return obj.GetHashCode();
}
}
然后,您可以使用此比较器使用GroupBy
对您的列表进行分组:
List<MyClass> flatList = ...
List<MyTargetDto> result = flatList.GroupBy(e => e.A, e => e.B, new Comparer())
.Select(g => new MyTargetDto {
A = g.Key,
ListOfB = g.ToList()});
.ToList();
如果ComplexType
已经有一个适当的Equals
实现,那么你可以省略比较器:
List<MyTargetDto> result = flatList.GroupBy(e => e.A, e => e.B)
.Select(g => new MyTargetDto {
A = g.Key,
ListOfB = g.ToList()})
.ToList();
GroupBy
的第一个lambda选择列表分组的元素。这将是结果Key
中的IGrouping
属性
第二个lambda选择应该包含在该组中的元素。
最终Select
为每个群组创建MyTargetDto
,将其A
属性设置为ComplexType
并创建ListOfB
。< / p>
答案 3 :(得分:0)
正如其他人已经发布的那样,解决方案就是
myList.GroupBy(x => x.A, x => x.B)
.Select(g => new MyTargetDto()
{
A = g.Key,
ListOfB = g.ToList()
});
只是希望您使用GroupBy
overload
myList.GroupBy(x => x.A, x => x.B, (key, g) => new MyTargetDto()
{
A = key,
ListOfB = g.ToList()
});