这种扩展方法是强制字符串为整数还是默认为0冗余?

时间:2010-08-30 14:05:15

标签: c# extension-methods type-conversion

我需要一个单行将字符串转换为整数,如果字符串是无效的,那么只需将其设置为零。所以我做了以下扩展方法,但我可以想象有一种系统方法可以在一行中完成。

在没有创建扩展方法的情况下,是否有另一种方法可以在一行中执行此操作?

using System;

namespace TestForceInteger
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("testing".ForceInteger() + 1);
            Console.WriteLine("199".ForceInteger() + 1);
            int test = StringHelpers.ForceInteger(null);
            Console.WriteLine(test + 1);
            Console.ReadLine();
            //output:
            //1
            //200
            //1
        }
    }

    public static class StringHelpers
    {
        public static int ForceInteger(this string potentialInteger)
        {
            int result;
            if (int.TryParse(potentialInteger, out result))
                return result;
            else
                return 0;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

不是单行,afaik,但是如果你想避免使用扩展方法,你可以将结果初始化为0并忽略TryParse的结果:

int result = 0;
int.TryParse(potentialInteger, out result)

答案 1 :(得分:2)

不是框架库的传统方式,没有。

如果返回一个可以为null的int,你的扩展方法会更好,这样就可以区分“invalid”和0。

答案 2 :(得分:0)

为了简化编写代码,代码不符合规范,请不要编写代码。创建一个实际正确完成工作的方法并记录无效转换和幻数之间的区别更有意义。制作此方法时,只需要制作一次,所以要正确使用。在它上面的图层中,您可以根据所使用的系统进行所需的转换。

即:

public static class Extensions
{
    public static int? ReturnIntegerIfValid(this string potentialInteger)
    {
        try
        {
            int result;

            if (int.TryParse(potentialInteger, out result))
            {
                return result;
            }
            else
            {
                return null;
            }
        }
        catch (ArgumentException)
        {
            return null;
        }
    }
}

答案 3 :(得分:0)

使用

int result;
result = Int32.TryParse(potentialInteger, out result) ? result : 0; // or default(int)

确保设置为0.但这绝对没必要(请参阅@ Anthony对@Paolo答案的评论)