[英]C# Lists: How to copy elements from one list to another, but only certain properties
因此,我列出了具有许多属性的对象。 这些属性中包括name和id 。 我们将此对象称为ExtendedObject。 我还声明了一个新列表,其中包含仅具有属性name和id的不同对象。 我们将此对象称为BasicObject。
我想做的是将ExtendedObject对象列表转换或复制(缺少更好的用词)到BasicObject对象列表。 我知道C#列表有很多有用的有趣方法,所以我想知道是否有一种简单的方法可以表达以下几点:
basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here);
但是我意识到它可能最终看起来并不像那样。 我还意识到,我可以遍历ExtendedObjects列表,从每个ExtendedObject的名称和ID创建一个新的BasicObject,然后将其推送到BasicObjects列表中。 但是我希望有比这更优雅的东西。
有人有什么想法吗? 非常感谢。
这完全取决于您BasicObject
从ExtendedObject
构造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();
此时, 子集包含一个匿名(运行时)类型的列表,该列表包含三个属性-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 <T>),可以使用Select语句获取特定的列数据(而不是整个行),从而创建匿名类型来描述给定行的列数据的子集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.