使用linq将对象模型列表映射到另一个列表
本文关键字:列表 映射 另一个 对象模型 linq 使用 | 更新日期: 2023-09-27 18:04:20
我有两个对象模型,它们共享一些属性和一种类型的列表,我想用它来创建另一种类型的列表。现在,我有这样的东西(它可以工作):
List<ObjectA> TheListOfObjectsA = the result of some query;
List<ObjectB> TheListOfObjectsB = new List<ObjectB>();
foreach (ObjectA TheObjectA in TheListObjectsA)
{
ObjectB TheObjectB = new ObjectB();
TheObjectB.Prop1 = TheObjectA.Prop1;
TheObjectB.Prop2 = TheObjectA.Prop2;
TheListOfObjectsB.Add(TheObjectB);
}
我很好奇是否以及如何在没有循环的linq语句中重写这个(即使我们知道linq语句将作为循环执行)
你是这个意思吗?
var TheListOfObjectsB = TheListObjectsA.Select(a => new ObjectB() { Prop1 = a.Prop1, Prop2 = a.Prop2 }).ToList();
List<ObjectB> TheListOfObjectsB = TheListOfObjectsA
.Select(t => new ObjectB {
Prop1 = t.Prop1,
Prop2 = t.Prop2,
}).ToList();
您必须调用ToList()
方法来获得List<ObjectB>
。否则,您将得到IEnumerable<ObjectB>
;
您可以使用ConvertAll
:
var output = listA.ConvertAll(new Converter<ObjectA, ObjectB>(ObjectAConverter));
然后定义转换器:
public static ObjectB ObjectAConverter(ObjectA a)
{
var b = new ObjectB();
b.Prop1 = a.Prop1;
b.Prop2 = a.Prop2;
return b;
}
这样做,并在公共场所定义converter方法,意味着您可以在任何时间执行此转换,而不必复制逻辑。
为了更简洁,您甚至可以在某处静态地声明转换器:
private static Converter<ObjectA, ObjectB> _converter =
new Converter<ObjectA, ObjectB>(ObjectAConverter);
public static Converter<ObjectA, ObjectB> ObjectAConverter { get { return _converter; } }
,然后像这样调用:
var output = listA.ConvertAll(TypeName.ObjectAConverter);
这应该有帮助…
var theListOfObjectsB = (from e in theListOfObjectsA select new ObjectB{prop1 = e.prop1 ,prop2= e.prop2 }).ToList();
你可以使用这个
var theListOfObjectsB = theListOfObjectsA
.Select(t => new ObjectB{
Prop1 = t.Prop1,
Prop2 = t.Prop2,
}).ToList();