Mam pętlę foreach, która czyta listę obiektów jednego typu i tworzy listę obiektów innego typu. Powiedziano mi, że wyrażenie lambda może osiągnąć ten sam wynik.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Jakakolwiek pomoc byłaby mile widziana - jestem nowy dzięki lambda i linq dzięki, s
Odpowiedzi:
Spróbuj wykonać następujące czynności
Wykorzystuje kombinację Lambdas i LINQ, aby osiągnąć rozwiązanie. Funkcja Wybierz jest metodą stylu projekcji, która zastosuje przekazane w delegacie (lub w tym przypadku lambda) do każdej wartości w oryginalnej kolekcji. Wynik zostanie zwrócony w nowym
IEnumerable<TargetType>
. Wywołanie .ToList to metoda rozszerzenia, która przekształci toIEnumerable<TargetType>
wList<TargetType>
.źródło
TargetType
? Skończyło się na czymś takim:List<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();
gdzie celem było zdobycie obiektu typuList<ISearchEntity>
Jeśli wiesz, chcesz przekonwertować z
List<T1>
doList<T2>
wtedyList<T>.ConvertAll
będzie nieco bardziej wydajny niżSelect
/ToList
ponieważ zna dokładny rozmiar na początek:W bardziej ogólnym przypadku, gdy znasz tylko źródło jako
IEnumerable<T>
, możesz użyćSelect
/ToList
. Państwo mogli również twierdzą, że w świecie, z LINQ, to bardziej idiomatyczne zacząć ... ale warto przynajmniej zdając sobie sprawę zConvertAll
możliwości.źródło
IEnumerable<T>
prostu zadzwońSelect
iToList
zgodnie z odpowiedzią Jareda.x => buildTargetType(x)
źródło
cannot cast expression
wyjątekźródło
Uważam, że coś takiego powinno działać:
źródło
.ToList()
na końcu, w przeciwnym razie będzie to po prostu IEnumerable.Oto prosty przykład ..
źródło
źródło
Załóżmy, że masz wiele właściwości, które chcesz przekonwertować.
źródło
Lub z
constructor
&linq
zSelect
:Linq
Linia jest bardziej miękka! ;-)źródło
Jeśli potrzebujesz użyć funkcji do rzutowania:
Gdzie jest moja funkcja niestandardowa:
źródło
dla podobnej klasy typu.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
źródło
Jeśli typy można rzutować bezpośrednio, jest to najczystszy sposób:
Jeśli typy nie mogą być rzutowane bezpośrednio, możesz odwzorować właściwości z typu oryginalnego na typ docelowy.
źródło
Rozważymy, że pierwszy typ listy to String i chcemy przekonwertować go na liczbę całkowitą typu List.
Dodaj wartości do oryginalnej listy.
Utwórz listę docelową typu liczby całkowitej
Drukuj wartości listy za pomocą forEach:
źródło