【发布时间】:2013-03-06 15:51:17
【问题描述】:
我有一份要评估的文件编号列表。这个列表非常大,我不想将所有文档编号都转换为 int,因为它们也可以包含字母。这是一个数字列表示例。
1070
1071
1072
1073
1074
1075
1076
1077
1078
CO1089
CO1099
CO2000
这些数字包含在 C# 中的对象中,我运行 Linq 以返回 Range 中的对象列表。这是我的 linq 代码。
results = from row in MyObjectList.AsQueryable<MyObject>()
where String.Compare(row.Header.DocNumber, _sDocumentStartNumber) >= 0
&& String.Compare(row.Header.DocNumber, _sDocumentEndNumber) <= 0
select row;
如果我的范围是
From: 1
To: 10000
用户希望取回该范围内的所有数字编号交易。但是,因为我正在比较字符串,所以我没有得到任何结果。
我可以检测到我的 to 和 from 值是数字,然后只评估带有数字的交易并使用基于该数字的 linq 语句(或编辑 linq 语句以进行转换和比较),但我关心的是性能这一点是因为返回时列表可能相当大。
我对这里的建议持开放态度,并且知道可能有许多路径都会导致相同的结果。我最关心的是性能。请记住,我可能会对非常大的数据集执行此操作,并且我需要在合理的时间内返回结果。
提前感谢您的任何建议。
~~~编辑~~~
其他信息
我使用的对象是 QuickBooks Online 的 Intuit IPP SDK 对象。我正在查询文档(例如发票)的直觉,并且需要对文档编号进行排序。 Intuit 不在他们的服务器端执行此操作,因此我必须在我方执行此操作。根据用户为其他搜索条件输入的内容,我最终可能会将他们的所有文档都包含在返回的列表中。
【问题讨论】:
-
“非常大”有多大?我建议首先以最简单的方式让代码工作,然后测试它的性能,而不是假设它会太慢。 (另外,你为什么使用
AsQueryable?)“CO2000”应该被视为2000,还是不被视为一个值? -
在选择范围时是否要包含“字母数字”文档编号?我建议创建自己的
IComparer而不是使用String.Compare。 -
在这种情况下,不返回包含字母字符的文档编号。我使用 AsQueryable 是因为“MyObject”实际上是我用来与其他产品交互的 SDK 对象列表。
-
很大的数字很容易超过 100,000。我没有确切的数字,这取决于用户在外部包中创建的对象数量。