C#LINQ:字符串(“”)如何解析为数组?

我试图将一个字符串解析成数组,并找到一个非常简洁的方法。

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(); 

我尝试删除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(); 

只是为了澄清,我使用int.TryParse只是为了确保在输入包含无效数据时不会出现exception。 它没有解决任何问题。 它也适用于int.Parse

更新 :正如Eric Lippert 在评论部分中使用int.TryParse在LINQ查询中certificate的那样可能是有害的。 因此,最好使用封装int.TryParse的helper方法并返回Nullable 。 所以像这样的扩展:

 public static int? TryGetInt32(this string item) { int i; bool success = int.TryParse(item, out i); return success ? (int?)i : (int?)null; } 

现在,您可以通过以下方式在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(); 

除非你跳过前两行,否则它不起作用的原因是这些行在int之后有逗号。 您的输入如下所示:

 "1," "2," "3" 

只有最后一个条目可以解析为int ; 最初的两个会产生exception。

将逗号和空格作为分隔符传递给Split将解决问题:

 string[] input = line .Substring(1, line.Length - 2) .Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries); 

请注意使用StringSplitOptions.RemoveEmptyEntries删除由条目之间使用的逗号和空格引起的空字符串。

我觉得你这样做会更好:

 JsonConvert.DeserializeObject(line, typeof(List)); 

你可能会试试

  string line = "[1,2,3]"; IEnumerable intValues = from i in line.Split(',') select Convert.ToInt32(i.Trim('[', ' ', ']'));