检查字符串是否可以解析为int数组的最佳方法是什么?

时间:2014-01-07 16:58:50

标签: c#

我需要确定是否可以将字符串解析为int数组。字符串可以采用

格式
  

" 124,456,789,0"

如果可以这样转换的话:

int[] Ids = SearchTerm.Split(',').Select(int.Parse).ToArray();

但是字符串也可能是这样的:

  

"这是一个字符串,非常好。"

在这种情况下,解析失败。

逻辑当前分为两个方向,基于字符串是否包含逗号字符(假设只有类似数组的字符串将包含此字符),但此逻辑现在存在缺陷,并且逗号字符现在出现在其他字符串中。 / p>

我可以在它周围放置一个Try..Catch,但我通常不喜欢通过异常控制逻辑流程。

有一种简单的方法吗?

6 个答案:

答案 0 :(得分:14)

  

我可以在它周围放置一个Try..Catch,但我通常不喜欢通过异常控制逻辑流程

态度很好。如果可以避免异常,请执行此操作。

提出了许多答案

int myint;
bool parseFailed = SearchTerm.Split(',')
                             .Any( s => !int.TryParse(s, out myint));

哪个不错,但也不是很好。我倾向于先写一个更好的辅助方法:

static class Extensions
{
    public static int? TryParseAsInteger(this string s)
    {
        int j;
        bool success = int.TryParse(s, out j);
        if (success)
            return j;
        else
            return null;
    }
}

现在你可以说:

bool parseFailed = SearchTerm.Split(',')
                             .Any( s => s.TryParseAsInteger() == null);

但我认为你真正想要的是解析状态如果它能够成功,而不仅仅是回答“解析会成功吗?”的问题。使用这种辅助方法,您可以说:

List<int?> parse = SearchTerm.Split(',')
                             .Select( s => s.TryParseAsInteger() )
                             .ToList();

现在如果列表包含任何空值,你知道它很糟糕;如果它不包含任何空值,那么你得到你想要的结果:

int[] results = parse.Contains(null) ? null : parse.Select(x=>x.Value).ToArray();

答案 1 :(得分:5)

int myint;
bool parseFailed = SearchTerm.Split(',')
                           .Any( s => !int.TryParse(s, out myint));

答案 2 :(得分:2)

您可以使用多行lambda表达式为每个int.TryParse方法结果获取Split

var input = "124,456,789,0";

var parts = input.Split(new [] {","}, StringSplitOptions.RemoveEmptyEntries);

var numbers
    = parts.Select(x =>
                    {
                        int v;
                        if (!int.TryParse(x, out v))
                            return (int?)null;
                        return (int?)v;
                    }).ToList();

if (numbers.Any(x => !x.HasValue))
    Console.WriteLine("string cannot be parsed as int[]");
else
    Console.WriteLine("OK");

它不仅会检查是否可以将值解析为int,还可以返回值,如果可以的话,那么您不必再进行两次解析。

答案 3 :(得分:0)

为什么不首先从字符串中删除字符并使用

bool res = int.TryParse(text1, out num1);

以下示例没有限制。 BigInteger类型是一个不可变类型,表示一个任意大的整数,其理论上的值没有上限或下限。 BigInteger MSDN

    string test = "20,100,100,100,100,100,100";
    test = test.Replace(",", "");
    BigInteger num1 = 0;
    bool res = BigInteger.TryParse(test, out num1);

答案 4 :(得分:0)

怎么样,

int dummy;
var parsable = SearchTerm.Split(',').All(s => int.TryParse(s, out dummy));

但如果你这样做,你也可以抓住异常

答案 5 :(得分:0)

您可以使用RegEx来确定字符串是否与您的模式匹配

类似这样的事情

       string st = "124,456,789,0";
        string pattS = @"[0-9](?:\d{0,2})";
        Regex regex = new Regex(pattS);
        var res = regex.Matches(st);
        foreach (var re in res)
        {
          //your code here   
        }

在rubular.com here

上测试