나는 JobDetailID와 CalculatedID 두 개의 열이있는 DataTable을 가지고있다. JobDetailID는 항상 고유하지 않습니다. 주어진 JobDetailID에 대한 CalculatedID의 첫 번째 인스턴스를 JobDetailID + "A"로하고, 동일한 JobDetailID를 가진 여러 행이있을 때 연속적인 행을 JobDetailID + "B", "C"등으로 만들고 싶습니다. 동일한 JobDetailID를 가진 행이 4 ~ 5 개를 넘지 않습니다.DataTable에서 값을보다 효율적으로 할당하는 방법은 무엇입니까?
나는 현재는 다음과 같이 구현하지만, 허용 할 수 없을 정도로 느린 :
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에서 calc를 수행하고 위의 코드를 피하는 것이 좋습니다. 어쩌면 가장 좋은 질문은 데이터를 어떻게 얻는 것입니까? –
처음에는 'DataTable'을 어떻게 채우고 있습니까? 데이터베이스 밖에 있다면이 열을 계산하는 것이 좋습니다. –
@SPFiredrake의 답변은 매우 판독 가능합니다 (보통 비 핵심 성능보다 선호). 그러나 "가장 빠름"은 아닙니다. 신속한 방법으로 작업하고 제안 된 답으로 답장을 보내주십시오. – DanielCuadra