2014-04-11 90 views
9

我有兩個列表。 BeamElevations<Elevation>FloorElevations<Elevation>。我如何將它們合併到Elevations<Elevation>列表中並使用Linq根據它們的高程對它們進行排序?將兩個列表<object>合併到一個列表中Linq

+0

什麼是-1? :) – Vahid

+0

沒有投票但id想象它,因爲缺乏研究努力 – Sayse

+0

我認爲這是因爲人們nobs –

回答

17

使用ConcatOrderBy

var result = list1.Concat(list2).OrderBy(x => x.Elevation).ToList(); 

如果你想刪除重複項,並得到一個唯一的一組元素,你也可以用Union方法:

var result = list1.Union(list2).OrderBy(x => x.Elevation).ToList(); 

爲了使它正常工作你需要在課堂上覆蓋EqualsGetHashCode方法。

+0

我可以使用'Union'嗎? – Vahid

+4

@Vahid是的,你可以但它會刪除重複,如果你重寫equals和gethascode爲你的class.It是不同於Concat請參閱[文檔](http://msdn.microsoft.com/en-us/library/bb341731 (v = vs.110).aspx):_This方法不包括來自返回集的重複項._ –

+0

我明白了。那麼我會堅持'Union'。 – Vahid

3

最初,你將它們合併象下面這樣:

Elevations=BeamElevations.Union(FloorElevations) 
         .ToList(); 

然後

Elevations=Elevations.OrderBy(x=>x.Elevation) 
        .ToList(); 

或者一步到位:

Elevations=BeamElevations.Union(FloorElevations) 
         .OrderBy(x=>x.Elevation) 
         .ToList(); 

另一種方式來實現這一目標是使用Concat

Elevations=BeamElevations.Concat(FloorElevations) 
         .OrderBy(x=>x.Elevation) 
         .ToList(); 
+0

感謝您的完整答覆。 – Vahid

+0

@Vahid你歡迎。 – Christos

+0

這是不完整的,聯盟不會刪除任何東西,如果你不覆蓋等於和gethashcode.It將工作就像Concat –

2
List<Elevation> Elevations= FloorElevations.Concat(BeamElevations).ToList(); 
1

使用List.AddRange

list1.AddRange(list2); 
    list1.OrderBy(l => l.Elevation); 
0

如果有任何開發者在那裏,可能會尋求在VB.NET的解決方案,在這裏你去:

Dim list1 As List(Of MyObject) 
Dim list2 As List(Of MyObject) 
Dim mergedAndSortedList As List(Of MyObject) 

mergedAndSortedList = (From obj In list1.Union(list2) 
         Order By obj.MyPropertyToSortOn 
         Select obj).ToList()