【发布时间】:2011-06-19 22:03:40
【问题描述】:
我有两个 T 类型的通用列表。两个列表都包含相同的类型,我想根据列表 2 中不存在的项目创建第三个列表(或列表 2 的过滤版本) 1,基于每个项目的ID。
每个列表都包含一个“包”对象,该对象具有一个 ID 属性。
现在我使用 For Each 循环来模拟代码,我知道这很糟糕(大 O 是常数时间),所以我想要一个更有效的方法。
根据项目要求,此代码在 VB 中,但我更喜欢 C# - 所以任何一个代码示例都适合我。
Private Sub RemoveStockPackagesFromSelection()
Dim p As Package
Dim packageList As List(Of Package) = New List(Of Package)
Dim stockPackageList As List(Of Package) = New List(Of Package)
Dim result As List(Of Package) = New List(Of Package)
' Fill list with User's Packages
For i As Integer = 0 To ListBox2.Items.Count - 1
p = New Package
p.Id = CInt(ListBox2.Items(i).Value)
p.Name = ListBox2.Items(i).Text
packageList.Add(p)
Next
' Fill list with Stock Packages to compare:
Dim ds As DataSet = DAL.GetStandardPackages()
For Each dr As DataRow In ds.Tables(0).Rows
p = New Package
p.Id = CInt(dr.Item("id"))
stockPackageList.Add(p)
Next
' Do Compare and Filter
For Each p1 As Package In packageList
For Each p2 As Package In stockPackageList
If Not p1.Id = p2.Id Then
result.Add(p2)
End If
Next
Next
' Here is our new trimmed list:
Response.Write(result.Count)
End Sub
什么是进行这种过滤的干净利落的 LINQ 或 Lamda 方式?我的方法的大 O 是什么,建议的方法的大 O 是什么(只是为了满足我的好奇心)。
谢谢
【问题讨论】:
-
你试过你的代码了吗?它不像你描述的那样工作。
-
Shawn,对于这样的问题,您可以省略基本列表的填充。我们相信您有两个列表。
-
这里有一些惊人的答案是在极短的时间内完成的。我喜欢这个论坛。我将使用 IEqualityComparer 和 Zebi 的 LINQ 查询构建一个示例,因为这主要是我正在寻找的,但我应用了有关使用 HashSets、Dictionaries 和 .Except() 扩展方法的建议。所有非常可靠和有趣的解决方案。我正在尝试掌握 Big O(这似乎是 CSE 当天的热门话题),因此感谢您的洞察力。很好的答案...
-
时间(和内存)复杂性一直是并且很可能永远是 CS 中的热门话题。
-
诚然,算法编程一直存在并且将永远存在,无论出现什么新语言 - Big O 将永远是一个“热门话题”。猜猜这有点愚蠢...... UndoSelfDepriatingComment() :)
标签: c# .net vb.net list generics