使用linq将对象模型列表映射到另一个列表

时间:2014-05-21 12:58:05

标签: c# linq

我有两个共享一些属性的对象模型和一个我想用来创建另一个类型列表的类型的列表。现在,我有类似的东西(并且有效):

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

感谢。

5 个答案:

答案 0 :(得分:25)

你是说这个吗?

var TheListOfObjectsB  = TheListObjectsA.Select(a => new ObjectB() { Prop1  = a.Prop1, Prop2 = a.Prop2 }).ToList();

答案 1 :(得分:4)

List<ObjectB> TheListOfObjectsB = TheListOfObjectsA
    .Select(t => new ObjectB {
        Prop1 = t.Prop1;
        Prop2 = t.Prop2;
    }).ToList();

您必须调用ToList()方法才能获得List<ObjectB>。否则,您将获得IEnumerable<ObjectB>;

答案 2 :(得分:1)

你可以使用它。

var theListOfObjectsB = theListOfObjectsA
    .Select(t => new ObjectB{
        Prop1 = t.Prop1,
        Prop2 = t.Prop2,
    });

答案 3 :(得分:1)

您可以使用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;
}

这样做,并在公共场所定义转换器方法,意味着您可以随时进行此转换,而无需复制逻辑。

为了更简洁,您甚至可以在某处静态声明转换器:

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);

答案 4 :(得分:1)

这应该有帮助...

var theListOfObjectsB  =  (from e in theListOfObjectsA  select new ObjectB{prop1 = e.prop1 ,prop2= e.prop2 }).ToList();