我需要确定是否可以将字符串解析为int数组。字符串可以采用
格式" 124,456,789,0"
如果可以这样转换的话:
int[] Ids = SearchTerm.Split(',').Select(int.Parse).ToArray();
但是字符串也可能是这样的:
"这是一个字符串,非常好。"
在这种情况下,解析失败。
逻辑当前分为两个方向,基于字符串是否包含逗号字符(假设只有类似数组的字符串将包含此字符),但此逻辑现在存在缺陷,并且逗号字符现在出现在其他字符串中。 / p>
我可以在它周围放置一个Try..Catch,但我通常不喜欢通过异常控制逻辑流程。
有一种简单的方法吗?
答案 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
上测试