如何解决如何在 foreach 循环中为 char 变量赋值? C#
我正在尝试这样做:
StringBuilder sb = new StringBuilder();
foreach(char ch in valor)
{
if (ch == ',')
ch = '.';
else if (ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9' || ch == ',')
{
sb.Append(ch);
}
}
我想要的是,如果字符是逗号,则使其成为点。但我收到以下错误
不可能给'ch'赋值,因为它是一个foreach交互变量
解决方法
为什么不在两个 if 分支中都附加?
foreach(char ch in valor)
{
if (ch == ',')
{
sb.Append('.');
}
else if (ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9')
{
sb.Append(ch);
}
}
,
只引入一个局部变量
StringBuilder sb = new StringBuilder();
foreach(char ch in valor)
{
var tmp = ch == ',' ? '.' : ch;
if (char.IsDigit(tmp) || tmp == '.')
{
sb.Append(tmp);
}
}
您也可以使用静态 char.IsDigit()
方法来检查字符是否为数字
你也可以只用 linq 来做:
var sb = new StringBuilder();
sb = valor
.Select(c => c == ',' ? '.' : c)
.Where(c => char.IsDigit(c) || c == '.')
.Aggregate(sb,(sb,c) => sb.Append(c));
,
简短回答:不可能。
使用不可变的 foreach
索引项,您需要使用这样的中间变量:
foreach ( char ch in valor )
{
char c = ch;
if ( c == ',' )
{
c = '.';
}
if ( c == '0' || c == '1' || c == '2' || c == '3' || c == '4'
|| c == '5' || c == '6' || c == '7' || c == '8' || c == '9'
|| c == '.' )
{
sb.Append(c);
}
}
我删除了 else
因为它似乎是一个错误...
但在这种情况下,您可能更喜欢直接使用 for
来避免这个无用的中间变量,从而优化速度和内存:
for (int index = 0; index < valor.Length; index++)
{
char c = valor[index];
if ( c == ',' )
{
c = '.';
}
if ( c == '0' || c == '1' || c == '2' || c == '3' || c == '4'
|| c == '5' || c == '6' || c == '7' || c == '8' || c == '9'
|| c == '.' )
{
sb.Append(c);
}
}
接下来,对于提供的代码,我们可以像这样重构,现在以正确的方式使用 else
:
for (int index = 0; index < valor.Length; index++)
{
char c = valor[index];
if ( c == ',' )
{
sb.Append('.');
}
else
if ( c == '0' || c == '1' || c == '2' || c == '3' || c == '4'
|| c == '5' || c == '6' || c == '7' || c == '8' || c == '9' )
{
sb.Append(c);
}
}
此外,对于提供的代码,我们可以改进:
for ( int index = 0; index < valor.Length; index++ )
{
char c = valor[index];
if ( c == ',' )
{
sb.Append('.');
}
else
if ( char.IsDigit(c) ) // or IsNumber
{
sb.Append(c);
}
}
为了更好地优化:
for ( int index = 0; index < valor.Length; index++ )
{
char c = valor[index];
if ( c == ',' )
{
sb.Append('.');
}
else
if ( c >= '0' && c <= '9' )
{
sb.Append(c);
}
}
因此,我们可以使用 foreach
来编写,但优化程度较低,但更干净:
foreach (char ch in valor )
{
if ( ch == ',' )
{
sb.Append('.');
}
else
if ( ch >= '0' && ch <= '9' )
{
sb.Append(ch);
}
}
,
你可以试试这个:
StringBuilder sb = new StringBuilder();
var valor = "google,com1234";
if (valor.Contains(','))
{
valor = valor.Replace(",",".");
}
foreach (char ch in valor)
{
if (ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9' || ch == '.')
{
sb.Append(ch);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。