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();