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