Списки С#: как скопировать элементы из одного списка в другой, но только определенные свойства

Итак, у меня есть список объектов с рядом свойств. Среди этих свойств: имя и 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 может использоваться для получения конкретных данных столбца (вместо целой строки), тем самым создавая анонимный тип для описания подмножества данных столбца для заданную строку.