0

我有一个对象列表(带有 id)和一个列表 int,如果提供列表 int,查询该列表对象的最佳方法是什么。

class CommonPartRecord {
  public int Id {get;set;}
  public object Others {get;set;}
}
var listObj = new List<CommonPartRecord>();
// Load listObj
var listId = new List<int>();
// Load listId

现在选择listObj,因为那些Id包含在listId中,我目前这样做:

var filterItems = listObj.Where(x => listId.Contains(x.Id));

执行此操作的更快方法是什么?谢谢,胡伊

4

1 回答 1

1
var tmpList = new HashSet<int>(listId);
var filterItems = listObj.Where(x => tmpList.Contains(x.Id));

这可能会给您带来性能提升或性能下降,这在很大程度上取决于listObjlistId.

您将需要对其进行分析,以查看您是否从中获得任何改进。


解释提升或下降:

我将使用一些非常夸张的数字来使数学更容易,让我们说以下

  • listObj.Where(x => listId.Contains(x.Id));每行需要 5 秒。
  • listObj.Where(x => tmpList.Contains(x.Id))每行需要 2 秒。
  • var tmpList = new HashSet<int>(listId);构建需要 10 秒。

让我们绘制出处理随行数变化的数据所需的时间listObj

+----------------+-----------------------------+- ---------------------------------+
| 行数 | 处理列表的秒数 | 使用哈希集处理的秒数 |
+----------------+-----------------------------+- ---------------------------------+
| 1 | 5 | 12 |
| 2 | 10 | 14 |
| 3 | 15 | 16 |
| 4 | 20 | 18 |
| 5 | 25 | 20 |
| 6 | 30 | 22 |
| 7 | 35 | 24 |
| 8 | 40 | 26 |
+----------------+-----------------------------+- ---------------------------------+

在此处输入图像描述

因此,您可以查看 listObj 是否有 1 到 3 行,您的旧方法更快,但是一旦您有 4 行或更多行,新方法会更快。

(注意我完全编造了这些数字,我可以保证 HashSet 的每行​​比 List 的每行​​快,但我不能告诉你快多少。你需要测试一下你是否获得更好的性能是 4 行或 4,000 行。知道的唯一方法是尝试两种方式并测试。)

于 2013-11-07T02:34:18.377 回答