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

27

我有两个对象模型,它们共享一些属性和一个我想用来创建另一种类型列表的一种类型列表。目前,我有类似这样的东西(它起作用):

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个回答

63

你的意思是这个吗?

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

好的,简短明了!顺便说一句,你应该进行编辑并在末尾添加.ToList() :) - frenchie

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

要获取一个List<ObjectB>, 你需要调用ToList()方法。否则,你将得到一个IEnumerable<ObjectB>


@Javad_Amiry:因为TheObjectA在上下文中不存在。 - Mike Perrenoud
дҪ жІЎжңүдҪҝз”ЁtпјҢиҖҢдё”TheObjectBжҳҜд»Җд№Ҳй¬јпјҹ - Robert Levy

3
您可以使用这个。
var theListOfObjectsB = theListOfObjectsA
    .Select(t => new ObjectB{
        Prop1 = t.Prop1,
        Prop2 = t.Prop2,
    }).ToList();

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

3

这应该会有所帮助...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接