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

Dav*_*vid 4 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();
Run Code Online (Sandbox Code Playgroud)

我尝试删除Skip(2),因为非int字符串,我无法获取数组.我的问题是那些LINQ函数的执行顺序是什么.Skip在这里打了多少次?

提前致谢.

Tim*_*ter 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(); 
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,我int.TryParse只是用来确保如果输入包含无效数据就不会出现异常.它没有任何修复.它也适用int.Parse.

更新:正如Eric Lippert 在评论部分中使用int.TryParseLINQ查询所证明的那样可能是有害的.所以最好使用封装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)

  • @TimSchmelter:开发人员实施该方法的时间是五分钟.但是这种方法需要一个规范 - 当然,这是一个很短的规范,但测试和文档需要规范才能工作.然后你编写测试和文档,然后将文档翻译成日语,并且...这些都加起来很多工作.所有这些都是*不会花在具有更高投资回报的更昂贵功能上的工作.就像我说的,没有便宜的功能,只有更便宜的功能. (3认同)
  • 我强烈建议不要在这样的 LINQ 查询中使用 out 参数。尽管这种特殊用法碰巧是安全的,但您可以轻松地进行细微的更改,从而使您陷入变量多次变异的情况,并且查询的后续部分正在查看变量的 *current* 值,而不是您的值想。 (2认同)