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

Sim*_*mon 2 c#

我需要确定是否可以将字符串解析为int数组.字符串可以是格式

"124,456,789,0"

如果它可以转换成如此:

int[] Ids = SearchTerm.Split(',').Select(int.Parse).ToArray();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我可以在它周围放一个Try..Catch,但我通常不利于控制异常的逻辑流程.

是否有捷径可寻?

Eri*_*ert 14

我可以在它周围放一个Try..Catch,但我通常不利于控制异常的逻辑流程

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

提出了许多答案

int myint;
bool parseFailed = SearchTerm.Split(',')
                             .Any( s => !int.TryParse(s, out myint));
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以说:

bool parseFailed = SearchTerm.Split(',')
                             .Any( s => s.TryParseAsInteger() == null);
Run Code Online (Sandbox Code Playgroud)

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

List<int?> parse = SearchTerm.Split(',')
                             .Select( s => s.TryParseAsInteger() )
                             .ToList();
Run Code Online (Sandbox Code Playgroud)

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

int[] results = parse.Contains(null) ? null : parse.Select(x=>x.Value).ToArray();
Run Code Online (Sandbox Code Playgroud)


Dam*_*ith 5

int myint;
bool parseFailed = SearchTerm.Split(',')
                           .Any( s => !int.TryParse(s, out myint));
Run Code Online (Sandbox Code Playgroud)