我试图找到一些关于我的问题的文章,但没有找到任何相关的或对我的应用程序有意义的文章。这是我的问题:
我有两个(> 20,000)个项目的列表。
我需要根据相反列表中的每个项目检查每个列表中的每个项目。
像这样的实现:
foreach(var item1 in List1)
{
foreach(var item2 in List2)
{
// Check item 1 against item 2.
// Check item 2 against item 1.
}
}
Run Code Online (Sandbox Code Playgroud)
由于为检查所做的工作,速度非常慢且无法使用。
有没有更有效的方法来处理这些需要像这样检查的大型项目列表?
如果我能提供更多信息,请告诉我。感谢您的任何帮助/建议。
我正在使用 C# .NET 3.5
编辑:让我试着简要解释一下这些检查。
item1 和 item2 是路径系统的一部分。item1 和 item2 由 N 个其他项目连接。我正在检查 item1 是否连接(有效路径)到 item2,并且 item2 连接到 item1。不能假设如果 item1 -> item2,比 item2 -> item1。所以这两项检查都是必要的。
数据库包含信息 if 和 how item1 -> item2 和 if/how item2 -> item1。在检查内部,有一个对服务的命名管道调用来进行检查。该服务会执行所有路径检查,并在 item1 -> item2 等情况下返回。
那是一张O(N * M)支票。
如果您只是比较某个键或其他键的相等性,那么假设合理的哈希码和良好的键分布,您可以使用 O(N + M) 次迭代。在 .NET 中执行此操作的最简单方法是使用 LINQ 连接:
var pairs = from x in List1
join y in List2 on x.Key1 equals y.Key2
select new { x, y}; // Or whatever
foreach (var pair in pairs)
{
// Process each match
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您不检查平等性,这没有帮助......但如果没有更多上下文,几乎不可能提供任何具体帮助。
尽量避免每次迭代都向数据库发出请求的情况。如果可能,请尝试在循环外进行全合一查询,或者在循环外获取所需的数据,然后对此数据进行检查。
一切都取决于检查操作。所以描述一下他们。但无论如何,如果您的迭代是独立的,您还可以使用 PLINQ 和任务并行库并行化您的循环
| 归档时间: |
|
| 查看次数: |
8640 次 |
| 最近记录: |