C# 更新字符串[]中的值的更好方法
我正在寻找更新列表/数组中的值的更好方法: 我的密码是-C# 更新字符串[]中的值的更好方法,c#,C#,我正在寻找更新列表/数组中的值的更好方法: 我的密码是- String[] values = baseValue.Split(new []{'+'}); 因为“值”可以有十进制/字符串值-我想更新此列表中的项目以删除十进制后的任何值- for (int i = 0; i < values.Count(); i++) { decimal newvalue; if (Decimal.TryParse(values[i], out newvalue)) {
String[] values = baseValue.Split(new []{'+'});
因为“值”可以有十进制/字符串值-我想更新此列表中的项目以删除十进制后的任何值-
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是否有更好的方法实现上述功能?您可以使用字符串操作,而不是先转换为十进制,再转换为整数,最后再转换为字符串
使用values.Length,它是数组类型中内置的属性。values.Count是一种LINQ扩展方法,它枚举所有数组项,因此效率低下。您可以使用字符串操作,而不是先转换为十进制,然后转换为int,最后再转换为字符串
使用values.Length,它是数组类型中内置的属性。values.Count是一种LINQ扩展方法,它枚举所有数组项,因此效率不高。Olivier的答案可能更好,因为它不需要三次转换,但如果您愿意,可以使用LINQ执行此操作:
values = baseValue.Split('+')
.Select(v => Decimal.ToInt32(Decimal.Parse(v)).ToString());
Olivier的答案可能更好,因为它不需要三次转换,但如果您愿意,您可以使用Linq实现这一点:
values = baseValue.Split('+')
.Select(v => Decimal.ToInt32(Decimal.Parse(v)).ToString());
您可以使用扩展方法:
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();
}
}
}
您可以使用扩展方法:
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();
}
}
}
较好的为什么更好?可读性?可维护性?表演聪明?LOC计数?还有别的吗?性能方面,这比任何LINQ expressionWell都要快。LINQ以一种功能性的方式处理序列:它不修改原始序列,只是将原始序列转换为不同的序列。然而,您的任务只是调整现有序列。我想说,虽然可能,但在LINQ中实现此任务是非常不自然的,因此应该避免。顺便说一句,您的标题是错误的:IEnumerable是只读的,因此您不能更新它,只能计算一个新的。只是一个改进:使用value.Length而不是CountBetter?为什么更好?可读性?可维护性?表演聪明?LOC计数?还有别的吗?性能方面,这比任何LINQ expressionWell都要快。LINQ以一种功能性的方式处理序列:它不修改原始序列,只是将原始序列转换为不同的序列。然而,您的任务只是调整现有序列。我想说的是,在LINQ中实现这项任务虽然可能是非常不自然的,因此应该避免。顺便说一下,您的标题是错误的:IEnumerable是只读的,所以你不能更新它,只能计算一个新的。只是一个改进:使用value.Length而不是Count-1:这有很多缺点:1它不像原始代码那样依赖于区域性。2它不适用于1、2等整数。3它将所有带有点的数字识别为一个数字,如.Are.You.+1,但在一般情况下,您可能应该使用而不仅仅是硬编码。由于您处理的是数组,因此,.Length可能比.Count更好。@DanielHilgarth:如果这些行是从文件中读取的,他们可能拥有与当前文化不同的另一种文化。我无法在这里提供文化问题的解决方案,因为我不知道实际情况。然而,你指出这个问题是对的。它确实适用于整数,因为值[i]已经包含所需的结果,即没有小数部分的数字!OP不太清楚具体的数值是什么。十进制/字符串是否意味着值可以与数字不同,并且可以包含点“.”,即使不是数字,还是意味着它们包含十进制数字作为字符串?他还说删除小数点后的任何值。我假设他的意思是删除小数点后的任何值。-1:这有很多缺点:1它不像原始代码那样依赖于区域性。2它不适用于1、2等整数。3它将所有带有点的数字识别为一个数字,如.Are.You.+1,但在一般情况下,您可能应该使用而不仅仅是硬编码。由于您处理的是数组,因此,.Length可能比.Count更好。@DanielHilgarth:如果这些行是从文件中读取的,他们可能拥有与当前文化不同的另一种文化。我无法在这里提供文化问题的解决方案,因为我不知道实际情况。然而,你指出这个问题是对的。它确实适用于整数,因为值[i]已经包含所需的结果,即没有小数部分的数字!OP不太清楚具体的数值是什么。十进制/字符串是否意味着值可以与数字不同,并且可以包含点“.”,即使不是数字,还是意味着它们包含十进制数字作为字符串?他还说删除小数点后的任何值。我假设他的意思是删除小数点后的任何值。如果不是源集合中的每个字符串都是数字的有效表示形式,则会引发异常。如果n,则会引发异常 ot源集合中的每个字符串都是数字的有效表示形式。
String[] values = baseValue.Split(new[] { '+' });
values.ConvertDecimalToInts();