2015-07-22 54 views
1

結構列表中提取ID我有結構的列表:C#使用LINQ

struct MyStruct{ 
    int ID; 
    string name; 
    string surname; 
} 
List<MyStruct> list1 = new List<MyStruct>(); 
///here the list is being updated so that it has some elements 

現在我想從列表1所有ID提取的投入另一個列表:

List<int> list2 = new List<int>(); 
list2.AddRange(list1.GetIds() /*LINQ HERE*/); 

訣竅是我想用LINQ來做,但我還是不太明白。我知道這可以用普通for循環我想使用AddRange和LINQ

回答

6

我認爲GetIds不存在,你想用LINQ代替它。你需要的方法Enumerable.Select

list2.AddRange(list1.Select(x => x.ID)); 

你也可以使用ToList代替AddRange

List<int> list2 = list1.Select(x => x.ID).ToList(); 

微/過早優化提示:AddRangeToList不知道該輸入序列的大小如果它不是一個集合。因此,他們列舉序列並使用List.Add添加項目。這會導致備份數組的大小調整。它也可以導致higher memory consumption than necessary

您可以用繞過它:

List<int> list2 = new List<int>(list1.Count); 
list2.AddRange(list1.Select(x => x.ID)); 
+0

是的,你認爲正確的,我只是把GetIds那裏,因爲我知道有些命令應該已經放在那裏提取的ID,我正在考慮選擇,但不知道如何使用它。謝謝 :) – Zwierzak

3

您可以使用Select方法。例如:

List<int> list2 = new List<int>(); 
var allIds = list1.Select(n => n.ID); 
list2.AddRange(allIds); 

你不必用戶AddRange方法,如果你的列表是空的。您只需將Select方法的結果分配到您的目的地列表。

0

試試這個,

list2.AddRange(list1.Select(C => C.ID).ToList());