Списки C#: как копировать элементы из одного списка в другой, но только определенные свойства
Итак, у меня есть список объектов с рядом свойств. Среди этих свойств есть имя и id. Назовем этот объект ExtendedObject. Я также объявил новый список разные объекты только свойства имя и id. Назовем этот объект BasicObject.
что я хотел бы сделать, это преобразовать или скопировать (за неимением лучших слов) список объектов ExtendedObject в список объектов BasicObject. Я знаю, что в списках C# есть много интересных методов, которые могут быть полезны, поэтому я задался вопросом, есть ли простой способ сказать что-то о:
basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here);
но я понимаю, что это может закончиться ничем подобным. Я также понимаю, что могу просто перебрать список ExtendedObjects, создать новый BasicObject из имени и идентификатора каждого ExtendedObject и поместить его в список BasicObjects. Но я надеялся на что-то более элегантное, чем что.
есть ли у кого-нибудь идеи? Большое спасибо.
4 ответов
это зависит от того, как именно вы построите свой BasicObject
С ExtendedObject
, но вы могли бы использовать 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
// "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();
в этот момент подмножество содержит список анонимного (runtime) типа, который содержит три свойства - 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