Списки С#: как скопировать элементы из одного списка в другой, но только определенные свойства
Итак, у меня есть список объектов с рядом свойств. Среди этих свойств: имя и id. Позвольте называть этот объект ExtendedObject. Я также объявил новый Список различных объектов, которые имеют только свойства имя и id. Позвольте называть этот объект BasicObject.
То, что я хотел бы сделать, это преобразовать или скопировать (из-за отсутствия лучших слов) список объектов ExtendedObject в список объектов BasicObject. Я знаю, что в списках С# есть много интересных методов, которые могут быть полезны, поэтому я задавался вопросом, есть ли простой способ сказать что-то о влиянии:
basicObjectList = extendedObjectList.SomeListMethod<BasicObject>(some condition here);
Но я понимаю, что это может не выглядеть так. Я также понимаю, что я мог просто пропустить список ExtendedObjects, создать новый BasicObject из каждого имени и id ExtendedObject и нажать его в список BasicObjects. Но я надеялся на что-то более элегантное, чем это.
Есть ли у кого-нибудь идеи? Большое спасибо.
Ответы
Ответ 1
Это зависит от того, как вы построили 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();
Ответ 2
если вы используете .NET 3.5 или выше, это можно сделать с помощью прогнозов LINQ:
basicObjectList = extendedObjectList.Select(x => new BasicObject { Id=x.Id, Name=x.Name})
Ответ 3
var basicObjectList = extendedObjectList.Select(eo => new BasicObject { name = eo.name, id = eo.id });
Ответ 4
Я думаю, что предложение 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();
В этот момент подмножество содержит список анонимного типа (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 <T> ) оператор Select может использоваться для получения конкретных данных столбца (вместо целой строки), тем самым создавая анонимный тип для описания подмножества данных столбца для заданную строку.