2009-12-15 73 views
146

我有一個foreach循環讀取一種類型的對象列表並生成不同類型的對象列表。我被告知lambda表達式可以達到相同的結果。使用lambda表達式將對象列表從一種類型轉換爲另一種

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

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

任何幫助將是appreciated-我是新來的λ和LINQ 感謝, 小號

+0

@mmcrae這個問題比這一個 –

回答

220

請嘗試以下

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

這是使用lambda表達式和LINQ的一種組合實現解決方案。 Select函數是一種投影樣式方法,它將傳遞給委託(或本例中的lambda)應用於原始集合中的每個值。結果將以新的IEnumerable<TargetType>返回。 .ToList調用是一種擴展方法,它會將此IEnumerable<TargetType>轉換爲List<TargetType>

+0

新有沒有辦法做到這一點,而不必爲'TargetType的具體實現'?我已經結束了這樣的事情:'List results = myIQueryable.Select(x =>(ISearchEntity)new TargetType {MyField =「Field value is」+ x.TargetField})。ToList();'where目標是獲得類型爲'List ' –

7

我相信這樣的事情應該工作:

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

的對象。您需要在末尾添加一個'.ToList()',否則這隻會提供一個IEnumerable。 – MattD

169

如果您知道你想從List<T1>轉換爲List<T2>然後List<T>.ConvertAll會略高於Select/ToList更有效,因爲它知道確切的大小開始於:

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

在更一般的情況下,當你只知道源作爲IEnumerable<T>,使用Select/ToList是要走的路。你可能會認爲,在一個使用LINQ的世界裏,開始時更習慣於......但至少值得注意的是ConvertAll選項。

+1

起初我並不認爲我可以這樣做,因爲我正在處理一個ienumerable(對於源列表,它不提供convertall選項),所以我對它調用.ToList(),現在我試圖convertall - 我喜歡它比放在非過濾'哪裏' – Stratton

+2

爲什麼你需要一個地方?如果你只有'IEnumerable ',那麼就按Jared的回答調用'Select'和'ToList'。 –

+0

對於像我這樣的其他新手,你也可以調用像'x => buildTargetType(x)' – Snekse

7
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(); 
+1

太棒了......正是我在找的東西!那麼不完全是......我只是想要列表中的每個元素的屬性,但是你給了我lamba語法,而不必滾動得太遠。 ;) – erroric

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

-1這隻會在鑄件可行的情況下才起作用,而在OP的情況下它確實如此。 –

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

這是什麼語法?這不會重組lambda。一些文件鏈接將不勝感激。謝謝,但它在這裏工作正常 –

+0

ConvertAll的參數是一個常規的C#lambda,對吧? –

相關問題