C# IEnumerable.Count() 抛出 IndexOutOfRangeException

标签 c# linq ienumerable

我在对集合进行分组时遇到以下情况:

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

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

当我检查

if(result.Count()>0)

它抛出一个IndexOutOfRangeException

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

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

最佳答案

首先,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());

关于C# IEnumerable.Count() 抛出 IndexOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260316/

相关文章:

c# - wpf DocumentViewer - 通过 GlyphRun 获取 ITextPointer,反之亦然

c# - 如何填补列表中属性值的空白?

c# - 如何从一个xml文件中读取多个属性

C#:使用语句中的 IEnumerator<T>

c# - 使用类作为派生约束有什么意义 - C# Generics

C# 将 System.ConsoleColor 转换为 System.Drawing.Color

c# - 有关C#中IEnumerator.GetEnumerator的问题

c# - 派生列表到基础 IEnumerable

c# - 在订阅中调用 Task.Factory.StartNew(async () => {}) 通常是可疑的吗?

linq - 在 LINQ 中选择多列