【发布时间】:2012-12-26 16:34:17
【问题描述】:
我有一个包含两列的 DataTable:JobDetailID 和 CalculatedID。 JobDetailID 并不总是唯一的。我希望给定 JobDetailID 的一个/第一个 CalculatedID 实例是 JobDetailID +“A”,并且当有多行具有相同的 JobDetailID 时,我希望连续的行是 JobDetailID +“B”、“C”等。具有相同 JobDetailID 的行不超过四五行。
我目前的实现方式如下,但速度慢得让人无法接受:
private void AddCalculatedID(DataTable data)
{
var calculatedIDColumn = new DataColumn { DataType = typeof(string), ColumnName = "CalculatedID" };
data.Columns.Add(calculatedIDColumn);
data.Columns["CalculatedID"].SetOrdinal(0);
var enumerableData = data.AsEnumerable();
foreach (DataRow row in data.Rows)
{
var jobDetailID = row["JobDetailID"].ToString();
// Give calculated ID of JobDetailID + A, B, C, etc. for multiple rows with same JobDetailID
int x = 65; // ASCII value for A
string calculatedID = jobDetailID + (char)x;
while (string.IsNullOrEmpty(row["CalculatedID"].ToString()))
{
if ((enumerableData
.Any(r => r.Field<string>("CalculatedID") == calculatedID)))
{
calculatedID = jobDetailID + (char)x;
x++;
}
else
{
row["CalculatedID"] = calculatedID;
break;
}
}
}
}
假设我需要遵守这种输出格式,我该如何提高这种性能?
【问题讨论】:
-
是否可以在获取数据的 proc 中进行计算?可能不是最优雅的解决方案,但您正在遍历结果集以添加一列。也许最好在 proc 中进行计算,然后避免上面的代码。也许更好的第一个问题是——你是如何获取数据的?
-
首先你是如何填充
DataTable的?如果它不在数据库中,我建议在那里计算此列。 -
@SPFiredrake 的答案非常易读(我通常更喜欢非关键性能),但它不是“最快的”。让我以更快的方法工作并将其作为建议的答案。
-
我刚刚放了一个我认为“更快”的版本,它仍然有根据尚未发现的需求进行优化的空间。虽然,这根本不使用 LINQ(这很好,如果您已经知道所需的逻辑,使用自定义代码会更快)
标签: c# performance linq datatable