У меня есть цикл 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
Попробуйте следующее
var targetList = origList
.Select(x => new TargetType() { SomeValue = x.SomeValue })
.ToList();
Здесь используется комбинация лямбд и LINQ для достижения решения. Функция Select - это метод в стиле проекции, который будет применять переданный делегат (или лямбду в данном случае) к каждому значению в исходной коллекции. Результат будет возвращен в новом IEnumerable<TargetType>
. Вызов .ToList является методом расширения, который преобразует эту IEnumerable<TargetType>
в List<TargetType>
.
Если вы знаете, что хотите преобразовать из List<T1>
в List<T2>
, то List<T>.ConvertAll
будет немного эффективнее, чем Select
/ToList
, потому что он знает точный размер для начала:
target = orig.ConvertAll(x => new TargetType { SomeValue = x.SomeValue });
В более общем случае, когда вы знаете об источнике только как о IEnumerable<T>
, использование Select
/ToList
является правильным решением. Вы можете также утверждать, что в мире с LINQ, это более идиоматично для начала... но стоит хотя бы знать о возможности ConvertAll
.
List<target> targetList = new List<target>(originalList.Cast<target>());
Я считаю, что нечто подобное должно сработать:
origList.Select(a => new TargetType() { SomeValue = a.SomeValue});
var list1 = new List<Type1>();
var list2 = new List<Type2>();
list1.ForEach(item => list2.Add(new Type2() { Prop1 = value1 }));
Предположим, что у вас есть несколько свойств, которые вы хотите конвертировать.
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 })
Если вам нужно использовать функцию В ролях:
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();
}
Или с конструктор
&ампер; ссылка с
выберите`:
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();
В линии более мягкие! ;-)
для подобного класса типа.
Список<targetlist, который> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));