C#中的IEnumerable.Count()抛出了IndexOutOfRangeException异常。

7

当我对一个集合进行分组时,出现了以下情况:

var result = data.GroupBy(x => x.Name.Split(new char[] { '-' })[1].Trim());

当数据变量的类型为ObservableCollection<Data>

当我进行检查时

if(result.Count()>0)

出现IndexOutOfRangeException的原因是字符串分割操作引发了异常。

问题是:有没有一种方法可以检查分组结果不为空并避免引发异常?


3
你正在通过 - 进行分割,并访问该数组的索引 1,也就是第二个项目。很显然,由于没有 -,所以没有第二项。因此,这与 null 没有任何关系。 - Tim Schmelter
是的,我知道,有没有办法在group by语句中检查数组的长度? - Mina Wissa
@KevinAvignon 它抛出相同的异常。 - Mina Wissa
1
类似 x => x.Name.Contains('-') ? x.Name.Split('-')[1] : "" 这样的代码不起作用吗? - Andy
@Andy,这也是一个不错的解决方案,你应该将其添加为答案。 - Mina Wissa
显示剩余2条评论
2个回答

10
首先,Enumerable.Count 只执行延迟执行的 LINQ 查询(GroupBy 使用延迟执行,请参阅 remarks 部分)。因此在这里不能归咎于 Count
你正在使用 - 进行拆分,并访问数组中的索引1,即第二个项目。显然没有第二个项目,因为没有出现 -。所以这与 null 无关。
也许仅取那些有第二个标记的就足够了:
var result = data
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) })
.Where(x => x.Split.Length >= 2)
.GroupBy(x => x.Split[1].Trim());

如果存在第二个,则为第二个,否则为第一个:

var result = data
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) })
.GroupBy(x => x.Split.Length >= 2 ? x.Split[1].Trim() : x.Split[0].Trim());

甚至可能是一个空组名的组(类似于) var result = data.GroupBy(x => (x.Name != null && x.Name.Contains('-')) ? x.Name.Split(new char[] { '-' })[1].Trim() : ""); - F5 F5 F5

2
您可以执行以下操作:
var result = data.GroupBy(x => x.Name.Contains('-') ? x.Name.Split('-')[1].Trim() : "");

如果您不喜欢 ?: 运算符或希望它更少的紧凑,可以使用:

var result = data.GroupBy(x =>
{
    string name = x.Name;
    if (name.Contains('-')) return name.Split('-')[1].Trim();
    return "";
});

注意: 我使用了Split('-')而不是Split(new char[] { '-' })

这种方式可能更加直观,但可以根据需要使用任意一种解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接