繁体   English   中英

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

[英]C# Lists: How to copy elements from one list to another, but only certain properties

因此,我列出了具有许多属性的对象。 这些属性中包括nameid 我们将此对象称为ExtendedObject。 我还声明了一个新列表,其中包含具有属性nameid不同对象。 我们将此对象称为BasicObject。

我想做的是将ExtendedObject对象列表转换或复制(缺少更好的用词)到BasicObject对象列表。 我知道C#列表有很多有用的有趣方法,所以我想知道是否有一种简单的方法可以表达以下几点:

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

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

有人有什么想法吗? 非常感谢。

这完全取决于您BasicObjectExtendedObject构造BasicObject ,但是您可能可以使用ConvertAll方法:

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

或者,如果您愿意,可以使用LINQ Select方法,然后转换回列表

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

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

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

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

假设以下extendedObjectList为IEnumerable <T>(包括列表):

// "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();

此时, 子集包含一个匿名(运行时)类型的列表,该列表包含三个属性-Property1Property2Property3

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

// 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 <T>),可以使用Select语句获取特定的列数据(而不是整个行),从而创建匿名类型来描述给定行的列数据的子集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM