【发布时间】:2020-11-28 02:11:43
【问题描述】:
我有一个数据表,我需要将记录分为两个,数据表(匹配)和数据表(不匹配)。对于要匹配的记录,必须有两行具有相同的 RRN,并且这两个 AMOUNT 之和为零。
我使用下面的代码实现了这一点。
if (InputCollection.Rows.Count > 0)
{
for (int i = InputCollection.Rows.Count - 1; i-- > 0;)
{
var selectedRecord = InputCollection.Rows[i];
if (selectedRecord["RRN"].ToString() != "")
{
for (int j = 0; j < InputCollection.Rows.Count - 1; j++)
{
if (i != j)
{
var thisRecord = InputCollection.Rows[j];
var selectedRRN = selectedRecord["RRN"].ToString();
var thisRRN = thisRecord["RRN"].ToString();
if (selectedRRN.Trim() == thisRRN.Trim())
{
if (Decimal.Parse(selectedRecord["AMOUNT"].ToString()) + Decimal.Parse(thisRecord["AMOUNT"].ToString()) == 0)
{
MatchedOutput.ImportRow(InputCollection.Rows[i]);
MatchedOutput.ImportRow(InputCollection.Rows[j]);
InputCollection.Rows.Remove(InputCollection.Rows[j]);
InputCollection.Rows.Remove(InputCollection.Rows[i]);
break;
}
}
}
}
}
代码的问题是它太慢了。如何在 c# 中使用 LINQ 查询重写上面的代码?谢谢。
【问题讨论】:
-
PRN列有什么类型?你一直在做ToString和Trim。为什么数据在放入表格之前没有清除多余的空格? -
从
Decimal.Parse判断,Amount列存储数字。但是,然后将此列设为typeof(decimal)。然后你就不需要解析了,代码会运行得更快。 -
Input Collection.Rows.Remove减慢了很多,因为它会在删除一列后移动所有其他列。摆脱对这个方法的调用。 -
@AlexanderPetrov '为什么数据在放入表格之前没有清除多余的空格? ' 因为它来自一个 excel 文件