在vb.net中,使用linq,加入2个对象列表。 两个列表都是相同的类型。
我搜索以Id的方式连接两个列表分组的最佳方法。 就像一个独特的人。
示例:
Imports System.Text
Imports System.Reflection
Module Module1
Sub Main()
Dim list1 As New List(Of Item)
For i As Integer = 1 To 4
list1.Add(New Item(i, i.ToString))
Next
Dim list2 As New List(Of Item)
For i As Integer = 3 To 6
list2.Add(New Item(i, i.ToString))
Next
Dim list3 As New List(Of Item)
list3 = (list1.Concat(list2)).ToList
Console.WriteLine(Item.PrintList(list3).ToString)
Console.ReadLine()
End Sub
End Module
Class Item
Private _Id As Integer
Private _Value As String
Public Property Id() As Integer
Get
Return _Id
End Get
Set(ByVal value As Integer)
_Id = value
End Set
End Property
Public Property Value() As String
Get
Return _Value
End Get
Set(ByVal value As String)
_Value = value
End Set
End Property
Public Sub New()
End Sub
Public Sub New(ByVal id As Integer, ByVal value As String)
Me.Id = id
Me.Value = value
End Sub
Public Overrides Function ToString() As String
Dim sb = New Text.StringBuilder()
For Each item In [GetType]().GetFields(BindingFlags.NonPublic Or BindingFlags.Instance)
sb.Append(String.Format("[{0} = {1}] ", item.Name, item.GetValue(Me)))
Next
Return sb.ToString()
End Function
Public Shared Function PrintList(ByVal myList As List(Of Item)) As StringBuilder
Dim result As New StringBuilder
For Each i In myList
result.AppendLine(i.ToString)
Next
Return result
End Function
End Class
concat之后list3包含的内容:
[_Id = 1] [_Value = 1]
[_Id = 2] [_Value = 2]
[_Id = 3] [_Value = 3]
[_Id = 4] [_Value = 4]
[_Id = 3] [_Value = 3]
[_Id = 4] [_Value = 4]
[_Id = 5] [_Value = 5]
[_Id = 6] [_Value = 6]
我们想要什么:
[_Id = 1] [_Value = 1]
[_Id = 2] [_Value = 2]
[_Id = 3] [_Value = 3]
[_Id = 4] [_Value = 4]
[_Id = 5] [_Value = 5]
[_Id = 6] [_Value = 6]
答案 0 :(得分:4)
我搜索以Id的方式连接两个列表分组的最佳方法。像一个 不同。
但是,您需要先在类Equals
中覆盖GetHashCode
和Item
。然后所有Linq方法都将使用您的ID:
Class Item
Public Property ID As Int32
Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing Then Return False
If Not TypeOf obj Is Item Then Return False
Return Id = DirectCast(obj, Item).Id
End Function
Public Overrides Function GetHashCode() As Integer
Return Id.GetHashCode()
End Function
End Class
现在您可以使用高效且清晰的Union
:
Dim list3 = list1.Union(list2).ToList
MSDN:
此方法从返回集中排除重复。这是不同的 行为到
Concat<TSource>
方法,返回所有 输入序列中的元素包括重复。 ... 比较 一个自定义数据类型,您需要实现此接口并提供 您自己的 GetHashCode 和等于类型的方法。
答案 1 :(得分:1)
在Tim Schmelter的回答中添加了Equals和GetHashCode,您现在也可以直接在Query上使用Concat和.Distinct:
Dim list3 As List(Of Item) = list1.Concat(list2).Distinct.ToList
或使用查询中的where和distinct:
Dim list3 As List(Of Item) = (From data In list1.Concat(list2) Where data.Value = "MyCity" Distinct).ToList
变化:
Dim list3 As List(Of Item) = (From data In list1.Concat(list2) Where data.Value = "MyCity").Distinct.ToList