преобразовать список объектов из одного типа в другой с помощью лямбда-выражения - PullRequest
192 голосов
/ 15 декабря 2009

У меня есть цикл foreach, читающий список объектов одного типа и создающий список объектов другого типа. Мне сказали, что лямбда-выражение может достичь того же результата.

var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>(); 

foreach(OrigType a in origList) {
    targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}

Буду признателен за любую помощь - я новичок в лямбда и linq Спасибо, s

Ответы [ 11 ]

277 голосов
/ 15 декабря 2009

Попробуйте следующее

var targetList = origList
  .Select(x => new TargetType() { SomeValue = x.SomeValue })
  .ToList();

Это использует комбинацию Lambdas и LINQ для достижения решения. Функция Select - это метод стиля проекции, который будет применять переданный делегат (или в данном случае лямбду) к каждому значению в исходной коллекции. Результат будет возвращен в новом IEnumerable<TargetType>. Вызов .ToList - это метод расширения, который преобразует IEnumerable<TargetType> в List<TargetType>.

199 голосов
/ 15 декабря 2009

Если вы знаете , который вы хотите конвертировать из List<T1> в List<T2>, тогда List<T>.ConvertAll будет немного более эффективным, чем Select / ToList, потому что он знает Точный размер для начала:

target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });

В более общем случае, когда вы знаете об источнике только как IEnumerable<T>, используйте Select / ToList. Вы могли бы также утверждать, что в мире с LINQ начинать более идиоматично ... но стоит хотя бы знать о опции ConvertAll.

47 голосов
/ 31 октября 2013
var target = origList.ConvertAll(x => (TargetType)x);
28 голосов
/ 08 июня 2012
List<target> targetList = new List<target>(originalList.Cast<target>());
12 голосов
/ 15 декабря 2009

Я считаю, что-то вроде этого должно работать:

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
8 голосов
/ 15 декабря 2009

Вот простой пример ..

List<char> c = new List<char>() { 'A', 'B', 'C' };

List<string> s = c.Select(x => x.ToString()).ToList();
7 голосов
/ 15 декабря 2009
var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
2 голосов
/ 02 октября 2018

Предположим, у вас есть несколько свойств, которые вы хотите преобразовать.

public class OrigType{
    public string Prop1A {get;set;}
    public string Prop1B {get;set;}
}

public class TargetType{
    public string Prop2A {get;set;}
    public string Prop2B {get;set;}
}

var list1 = new List<OrigType>();
var list2 = new List<TargetType>();

list1.ConvertAll(x => new OrigType { Prop2A = x.Prop1A, Prop2B = x.Prop1B })
0 голосов
/ 23 февраля 2019

Или с constructor & link с Select:

public class TargetType {
  public string Prop1 {get;set;}
  public string Prop1 {get;set;}

  // Constructor
  public TargetType(OrigType origType) {
    Prop1 = origType.Prop1;
    Prop2 = origType.Prop2;
  }
}

var origList = new List<OrigType>();
var targetList = origList.Select(s=> new TargetType(s)).ToList();  

Линия Link более мягкая! ; -)

0 голосов
/ 05 декабря 2018

для класса схожего типа.

List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...