Конвертировать список объектов из одного типа в другой, используя выражение лямбда

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

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

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

Любая помощь будет оценена - я новичок в лямбда и linq благодаря, з

Ответ 1

Попробуйте выполнить

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

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

Ответ 2

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

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

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

Ответ 3

var target = origList.ConvertAll(x => (TargetType)x);

Ответ 4

List<target> targetList = new List<target>(originalList.Cast<target>());

Ответ 5

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

origList.Select(a => new TargetType() { SomeValue = a.SomeValue});

Ответ 6

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));

Ответ 7

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

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

List<string> s = c.Select(x => x.ToString()).ToList();

Ответ 8

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

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 })

Ответ 9

Если вам нужно использовать функцию для трансляции:

var list1 = new List<Type1>();
var list2 = new List<Type2>();

list2 = list1.ConvertAll(x => myConvertFuntion(x));

Где моя пользовательская функция:

private Type2 myConvertFunction(Type1 obj){
   //do something to cast Type1 into Type2
   return new Type2();
}

Ответ 10

для аналогичного типа.

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