C#列表:如何将元素从一个列表复制到另一个列表,但只复制某些属性

时间:2010-09-28 13:57:42

标签: c# list

所以我有一个包含许多属性的对象列表。这些属性包括名称 ID 。我们将此对象称为ExtendedObject。我还宣布了一个新的不同对象列表,其属性名称 id 。我们将此对象称为BasicObject。

我想要做的是将ExtendedObject对象列表转换或复制(缺少更好的单词)到BasicObject对象列表。我知道C#列表有很多有用的方法,所以我想知道是否有一种简单的方法来说明效果:

basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here);

但我意识到它可能最终看起来不像那样。我也意识到我可以循环遍历ExtendedObjects列表,从每个ExtendedObject的名称和id创建一个新的BasicObject,并将其推送到BasicObjects列表中。但是我希望有一些比这更优雅的东西。

有没有人有任何想法?非常感谢。

4 个答案:

答案 0 :(得分:27)

这取决于您从BasicObject构建ExtendedObject的具体方式,但您可以使用ConvertAll方法:

List<BasicObject> basicObjectList =
    extendedObjectList.ConvertAll(x => new BasicObject
                                           {
                                               id = x.id,
                                               name = x.name
                                           });

或者,如果您愿意,可以使用LINQ Select方法然后使用convert back to a list

List<BasicObject> basicObjectList =
    extendedObjectList.Select(x => new BasicObject
                                       {
                                           id = x.id,
                                           name = x.name
                                       }).ToList();

答案 1 :(得分:8)

如果您使用的是.NET 3.5或更高版本,可以使用LINQ投影来完成:

basicObjectList = extendedObjectList.Select(x => new BasicObject { Id=x.Id, Name=x.Name})

答案 2 :(得分:4)

var basicObjectList = extendedObjectList.Select(eo => new BasicObject { name = eo.name, id = eo.id });

答案 3 :(得分:0)

我认为OP对“BasicObject”的建议只是具有原始集合中特定属性子集的结果对象的假名。匿名类型是你的朋友(由@mumtaz表示)。

假设以下 extendedObjectList ,如果IEnumerable&lt; T&gt; (包括清单):

// "var" used so that runtime infers the type automatically
var subset = extendedObjectList
   // you can use any Linq based clause for filtering
   .Where(a => <conditions>)
   // where the runtime creates a runtime anonymous type to describe your "BasicObject"
   .Select(a => new { a.Property1, a.Property2, a.Property3 })
   // conversion to a List collection of your anonymous type
   .ToList();

此时, subset 包含一个匿名(运行时)类型的List,其中包含三个属性 - Property1 Property2 Property3

您可以按如下方式操作此结果列表:

// execute an anonymous delegate (method) for each of the new anonymous objects
subset.ForEach
(
   basicObject =>
   {
      Console.WriteLine("Property1 - {0}", basicObject.Property1);
      Console.WriteLine("Property2 - {0}", basicObject.Property2);
      Console.WriteLine("Property3 - {0}", basicObject.Property3);
   }
);

// grab the first object off the list
var firstBasicObject = subset.First();

// sort the anonymously typed list
var sortedSubset = subset.OrderBy(a => a.Property1).ToList();

运行时解析了新对象(来自源对象的任何属性组合)后,您可以以任何方式使用它。

对于Linq-to-Sql应用程序(使用IQueryable&lt; T&gt;), Select 语句可用于获取特定列数据(而不是整行),从而创建一个匿名类型描述给定行的列数据的子集。