【发布时间】:2020-06-30 05:00:38
【问题描述】:
我有一个 DataTable 列,其中的值包含数字和字母。例如:
"2A""13ABC""412BBIL"
我正在使用下面的循环在该 DataTable 中每一行的每个值之前添加空格。但是,我使用的循环计算每个字符 - 我只需要它计算数字并忽略任何非数字(如空格或特殊字符)。
为了进一步说明,"412BBIL" 有 3 位数字,"13ABC" 有 2 位数字,"2A" 有 1 位数字。
- 在此示例
"412BBIL"中,3 位是当前最大值,并且因为它在列中具有最大位数,所以没有添加空格。 - 因为
"13ABC"有 2 位数字(因此比最大值少一位),它会添加一个空格 ->" 13ABC"。 - 因为
"2A"有 1 个数字(因此比最大值少两个),它会添加 2 个空格 ->" 2A"。
我的代码目前工作得非常好(但这可能不是最好的方法)——我只需要它来计算数字,而不是每个字符。如何调整下面的代码,以尽可能最有效的方式完成我需要的工作?
string maxString = dtDataTable.AsEnumerable()
.Select(row => row["NumberColumn"].ToString())
.OrderByDescending(st => st.Length).FirstOrDefault();
int maxStringLength = 0;
foreach (char c in maxString)
{//Get the maximum character length in column
if (!char.IsWhiteSpace(c))
{
maxStringLength++;
}
}
//minStringLength = the minimum character length in column
int minString = 0;
int minStringLength = 9999;
for (int i = 0; i < dtDataTable.Rows.Count; i++)
{
minString = 0;
foreach (char c in dtDataTable.Rows[i]["NumberColumn"].ToString())
{
if (!char.IsWhiteSpace(c))
{
minString++;
}
}
if ((minString <= minStringLength) && (minString != 0))
{
minStringLength = minString;
}
}
//Add Spaces
int tempInt = 0;
for (int i = 0; i < dtDataTable.Rows.Count; i++)
{
tempInt = 0;
foreach (char c in dtDataTable.Rows[i]["NumberColumn"].ToString())
{
if (!char.IsWhiteSpace(c))
{//char.IsDigit(c) might work
tempInt++;
}
}
for (int x = 0; x != (maxStringLength - tempInt); x++)
{
dtDataTable.Rows[i]["NumberColumn"] = " " + dtDataTable.Rows[i]["NumberColumn"].ToString();
}
}
【问题讨论】:
-
if (char.IsDigit(c)) tempInt++;?