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('[', ' ', ']'));