2014-04-11 55 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()