Better way to update values in string[]
我正在寻找更新列表/数组中的值的更好方法:
我的密码就像-
1
| String[] values = baseValue .Split(new []{'+'}); |
因为"values"可以有十进制/字符串值-我想更新此列表中的项目以删除十进制之后的任何值-
1 2 3 4 5 6 7 8
| for (int i = 0; i < values.Count(); i++)
{
decimal newvalue;
if (Decimal.TryParse(values[i], out newvalue))
{
values[i] = Decimal.ToInt32(newvalue).ToString();
}
} |
有没有更好的方法来实现以上使用LINQ/不使用LINQ?
- 更好?为了什么更好?可读性?可维护性?性能?聪明?LOC计数?还有别的吗?
- 性能方面,这比任何LINQ表达式都快
- 好。Linq以一种功能性的方式处理序列:它不修改原始序列,只将原始序列转换为不同的序列。但是,您的任务只是调整现有序列。我会说,在LINQ中实现这个任务(尽管可能)是非常不自然的,因此应该避免。
- 顺便说一下,你的标题是错误的:IEnumerable<...>是只读的,所以你不能更新它(只计算一个新的)。
- 请不要在标题中加"C",这就是标签的用途。
- 只是一个改进:使用value.length而不是count()。
- 不清楚目标是什么。随机猜测:考虑同时使用延迟执行来对其进行线性化。写一个迭代器。
- @出于好奇,为什么在这种情况下,Length比Count()更好?
- .Count()是LINQ扩展函数,而Length是数组本身的属性。我想江户十一〔一〕会跑得更快。Count可能会打电话给Length,不过我还没有打开Reflector来确定答案。
- @briansnow stackoverflow.com/questions/6646449/&hellip;
- @查理&mdm谢谢。
您可以使用字符串操作,而不是先转换为decimal,然后转换为int,最后转换回string。
1 2 3 4 5 6 7 8
| string[] values = baseValue.Split('+');
for (int i = 0; i < values.Length; i++)
{
int pos = values[i].IndexOf('.');
if (pos >= 0) {
values[i] = values[i].Substring(0, pos);
}
} |
因为这里没有四舍五入。
String.Split有一个参数params char[] separator过载。由于params关键字,您可以指定任意多个字符,而无需显式创建数组。
1
| string[] result = s.Split('x', 'y', 'z'); |
使用values.Length,它是内置于数组类型中的属性。values.Count()是一种LINQ扩展方法,它枚举所有数组项,因此效率不高。
- -1:这有很多缺点:(1)它不像原始代码那样依赖于文化。(2)它不适用于1、2等整数。(3)它把所有带点的东西都识别为像How.Are.You这样的数字。
- +1尽管在一般情况下,您应该使用当前区域设置的十进制分隔符,而不仅仅是硬编码"。
- 因为您处理的是一个数组,所以这里的.Length可能比.Count()要好。
- @Danielhilgarth:如果从文件中读取行,那么它们可能有另一种文化,而不是当前的文化。我不能为这里的文化问题提供解决方案,因为我不知道实际情况。但是,您指出这个问题是正确的。它确实适用于整数,因为values[i]已经包含了所需的结果,即一个没有小数部分的数字!
- 操作不太清楚值究竟是什么。decimal/string是否意味着值可以与数字不同,即使不是数字也可以包含一个点("."),还是意味着它们包含十进制数字作为字符串?他还说"删除小数点后的任何值"。我假设他是指"删除小数点后的任何值"。
- @MDM:你是对的。我刚刚复制了操作码,后来更正了它。
您可以使用扩展方法:
1 2 3 4 5 6 7 8 9 10 11
| public static void ConvertDecimalToInts(this string[] values)
{
for (int i = 0; i < values.Count(); i++)
{
decimal newvalue;
if (Decimal.TryParse(values[i], out newvalue))
{
values[i] = Decimal.ToInt32(newvalue).ToString();
}
}
} |
因此使用它:
1 2
| String[] values = baseValue .Split(new[] { '+' });
values .ConvertDecimalToInts(); |
Olivier的答案可能更好,因为它不需要进行三次转换,但如果您愿意,可以使用Linq进行此操作:
1 2
| values = baseValue.Split('+')
.Select(v => Decimal.ToInt32(Decimal.Parse(v)).ToString()); |
- 如果不是源集合中的每个字符串都是数字的有效表示形式,则会引发异常。