我正在尝试将字符串解析为数组并找到一种非常简洁的方法。
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在这里叫了多少次?
提前致谢。
答案 0 :(得分:6)
订单是您指定的订单。因此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
来确保在输入包含无效数据时不会出现异常。它没有解决任何问题。它也适用于int.Parse
。
更新:正如Eric Lippert in the comment section在LINQ查询中使用int.TryParse
所证明的那样可能是有害的。因此,最好使用封装int.TryParse
并返回Nullable<int>
的辅助方法。所以像这样的扩展:
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();
答案 1 :(得分:3)
除非你跳过前两行,否则它不起作用的原因是这些行在int
之后有逗号。您的输入如下所示:
"1," "2," "3"
只有最后一个条目可以解析为int
;最初的两个会产生异常。
将逗号和空格作为分隔符传递给Split
将解决问题:
string[] input = line
.Substring(1, line.Length - 2)
.Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries);
注意使用StringSplitOptions.RemoveEmptyEntries
删除由逗号和条目之间使用的空格引起的空字符串。
答案 2 :(得分:0)
我认为你这样做会更好:
JsonConvert.DeserializeObject(line, typeof(List<int>));
答案 3 :(得分:0)
string line = "[1,2,3]";
IEnumerable<int> intValues = from i in line.Split(',')
select Convert.ToInt32(i.Trim('[', ' ', ']'));