我试图将一个字符串解析成数组,并找到一个非常简洁的方法.
string line = "[1, 2, 3]";
string[] input = line.Substring(1, line.Length - 2).Split();
int[] num = input.Skip(2)
.Select(y => int.Parse(y))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
我尝试删除Skip(2),因为非int字符串,我无法获取数组.我的问题是那些LINQ函数的执行顺序是什么.Skip在这里打了多少次?
提前致谢.
订单是您指定的订单.因此input.Skip(2)
跳过数组中的前两个字符串,所以只剩下最后一个字符串3
.这可以解析为int
.如果你删除了Skip(2)
你正试图解析所有这些.这不起作用,因为逗号仍在那里.您已使用空格分割,但未删除逗号.
你可以使用line.Trim('[', ']').Split(',');
和int.TryParse
:
string line = "[1, 2, 3]";
string[] input = line.Trim('[', ']').Split(',');
int i = 0;
int[] num = input.Where(s => int.TryParse(s, out i)) // you could use s.Trim but the spaces don't hurt
.Select(s => i)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,我int.TryParse
只是用来确保如果输入包含无效数据就不会出现异常.它没有任何修复.它也适用int.Parse
.
更新:正如Eric Lippert 在评论部分中使用int.TryParse
LINQ查询所证明的那样可能是有害的.所以最好使用封装int.TryParse
并返回a 的辅助方法Nullable<int>
.所以像这样的扩展:
public static int? TryGetInt32(this string item)
{
int i;
bool success = int.TryParse(item, out i);
return success ? (int?)i : (int?)null;
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过以下方式在LINQ查询中使用它:
string line = "[1, 2, 3]";
string[] input = line.Trim('[', ']').Split(',');
int[] num = input.Select(s => s.TryGetInt32())
.Where(n => n.HasValue)
.Select(n=> n.Value)
.ToArray();
Run Code Online (Sandbox Code Playgroud)