使用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语句将作为循环执行)

使用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();