C# IEnumerable.Count() 抛出 IndexOutOfRangeException
C# IEnumerable.Count() throws IndexOutOfRangeException
我在对集合进行分组时遇到以下情况:
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());
您可以执行以下操作:
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 的解决方案更直观,但您可以随意使用。
我在对集合进行分组时遇到以下情况:
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());
您可以执行以下操作:
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 的解决方案更直观,但您可以随意使用。