2017-08-09 198 views
-2

我試圖最小化這個。C#從屬性列表中創建一個對象列表

List<ClassB> foo(List<ClassA> listA) 
{ 
    var listB = new List<ClassB>(); 
    foreach (var item in listA) 
     listB.Add(new ClassB(item, "stuff")); 

    return listB; 
} 

有沒有什麼辦法可以儘量減少這種使用LINQ?我想盡量減少這種情況,因爲在我的代碼庫中有很多這樣的轉換,泛型無法處理要轉換的各種類的怪癖。

+2

是的,有。你有沒有試過任何linq? ('選擇')請顯示你的嘗試。我們可以從那裏獲得幫助 –

+3

如果每個班級都有「怪癖」,那麼不會,但是沒有解決非常見問題的通用解決方案。對於問題中的具體代碼,你可以做'listA.Select(item => new ClassB(item,「stuff」))。ToList()',但是如果其他類的構造在每種情況下都不相同,那麼1一般簡單的單線不起作用。 –

+0

如果我錯了,糾正我,但用'選擇'我可以從原始列表中選擇幾個(或全部)。但是,我如何將它們轉換爲'classB'列表? – Crimson7

回答

3

Select方法是你所需要的。它基本上做的是將枚舉中的每個元素轉換爲其他元素。在這種情況下,您正在將所有ClassA轉換爲ClassB

Select爲的論點是需要的ClassA一個實例,並返回一個ClassB的方法。在這種情況下,該方法是這樣的:

ClassB MyMethod(ClassA obj) { 
    return new ClassB(obj, "stuff"); 
} 

這可以寫成lambda表達式形式:

obj => new ClassB(obj, "stuff") 

你傳遞這Select,調用ToListIEnumerable轉向一個List<ClassB>,它的完成了!

List<ClassB> foo(List<ClassA> listA) 
{ 
    return listA.Select(obj => new ClassB(obj, "stuff")).ToList(); 
} 
+0

我認爲他的意思是'listA.Select'。感謝您的解釋。我會在幾分鐘內將其標記爲答案。 – Crimson7

+1

@MongZhu哎呀,我誤解了OP的代碼... – Sweeper

3

你可以做很多的東西,在一個select聲明,包括你有對象建立新的對象:

List<ClassB> foo(List<ClassA> listA) 
{ 
    return lisA.Select(row => new ClassB(row, "stuff").ToList(); 
} 
+0

明白了,謝謝:) – Crimson7

3

您可以使用LINQ項目的listA的元素融入到ClassB的intances:

listA.Select(a => new ClassB(a, "stuff")).ToList() 
相關問題