C#IEnumerable.Count()抛出IndexOutOfRangeException

时间:2015-10-21 13:13:10

标签: c# linq ienumerable

在对集合进行分组时,我有以下情况:

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

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

当我检查

if(result.Count()>0)

它会抛出 IndexOutOfRangeException

当然会发生这种情况,因为字符串拆分操作会引发异常。

问题是:有没有办法检查分组的结果是否为空并避免异常?

2 个答案:

答案 0 :(得分:10)

首先,Enumerable.Count只执行延迟执行的LINQ查询(GroupBy使用延迟执行,查看备注部分)。所以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());

答案 1 :(得分: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[] { '-' })

这可能比Tim Schmelter的解决方案更直观,但使用你想要的东西。