所以我有一个包含许多属性的对象列表。这些属性包括名称和 ID 。我们将此对象称为ExtendedObject。我还宣布了一个新的不同对象列表,其仅属性名称和 id 。我们将此对象称为BasicObject。
我想要做的是将ExtendedObject对象列表转换或复制(缺少更好的单词)到BasicObject对象列表。我知道C#列表有很多有用的方法,所以我想知道是否有一种简单的方法来说明效果:
basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here);
但我意识到它可能最终看起来不像那样。我也意识到我可以循环遍历ExtendedObjects列表,从每个ExtendedObject的名称和id创建一个新的BasicObject,并将其推送到BasicObjects列表中。但是我希望有一些比这更优雅的东西。
有没有人有任何想法?非常感谢。
答案 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 语句可用于获取特定列数据(而不是整行),从而创建一个匿名类型描述给定行的列数据的子集。