C#LINQ:字符串(" [1,2,3]")如何解析为数组?

时间:2015-03-11 13:56:16

标签: 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在这里叫了多少次?

提前致谢。

4 个答案:

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