Конвертировать список объектов из одного типа в другой, используя выражение лямбда
У меня есть цикл 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>));