如何防止LINQ WHERE中的System.IndexOutOfRangeException?

Hel*_*ira 5 c# linq split

当我使用String.Split随机字符串时,我正面临这个异常.

List<string> linhas = new List<string>();

linhas.Add("123;abc");
linhas.Add("456;def");
linhas.Add("789;ghi");
linhas.Add("chocolate");

var novas = linhas.Where(l => l.ToString().Split(';')[1]=="def");
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 12

最后一个字符串"chocolate"不包含a ";",因此String.Split返回一个包含单个字符串的数组"chocolate".这就是为什么如果你尝试访问第二个,你会得到异常的原因.

您可以使用ElementAtOrDefault哪个null字符串返回:

var novas = linhas.Where(l => l.Split(';').ElementAtOrDefault(1) == "def");
Run Code Online (Sandbox Code Playgroud)

使用匿名类型的更长方法:

var novas = linhas
    .Select(l => new { Line = l, Split = l.Split(';') })
    .Where(x => x.Split.Length >= 2 && x.Split[1] == "def")
    .Select(x => x.Line);
Run Code Online (Sandbox Code Playgroud)

  • @kai:我完全不知道OP需要什么.所以我不能假设这是否是一个好的方法.我们知道的太少,OP的样本也可能会被简化. (3认同)
  • 虽然这会"起作用"(对于某些给定的工作定义)我认为从坐下一分钟就会赢得很多,想到为什么列表中的项目没有我们需要的东西.它是列表的问题吗?它应该是一堆元组/ KVpairs吗?我们应该对输入进行消毒吗?我认为这是一个只是"让它上班"的案例,而且只会导致类似的问题.确定业务需求并找到更好的方法来封装它. (2认同)
  • 您不必假设认为op不是最有经验的开发人员,并且可能在此处有x/y问题:/ (2认同)