我有一个全局linq扩展方法,它从给定列表中检索表示最多的元素。以下是样本:
public static T GetMostRepresentedElement<T, U>(this IEnumerable<U> _Collection, Func<U, T> _GetElem)
{
return _Collection.GroupBy(e => _GetElem(e))
.Select(f => new
{
Count = f.Count(),
Elem = f.Key
})
.OrderByDescending(g => g.Count)
.First()
.Elem;
}
发生这个代码块会引发异常:
At First:Sequence不包含任何元素StackTrace:at System.Linq.Enumerable.First [TSource](IEnumerable1 source)at IHMTools.Utilities.LinqExtensions.GetMostRepresentedElement [T,U](IEnumerable1 _Collection,Func2 _GetElem)
我怎样才能使这种方法安全? 我是否必须对此方法进行修复,或者更好地注意我发送给方法的数据?
答案 0 :(得分:7)
如果集合为空,First()
将抛出您收到的异常。您可以使用FirstOrDefault()
为空案例返回T
的默认值。
由于你的LINQ非常复杂,你可能最好提前退出来处理这个案例,然后你也可以避免空白案例,因为评论者指出了这一点。像if (!_Collection.Any()) return default(T);
答案 1 :(得分:2)
表达式的第一部分可能没有返回任何项目。获取空集合的第一项将引发异常。
您可以使用FirstOrDefault()
,然后确保您无法跟进空引用例外:
public static T GetMostRepresentedElementStruct<T, U>(this IEnumerable<U> _Collection, Func<U, T> _GetElem)
{
var t = _Collection.GroupBy(e => _GetElem(e))
.Select(f => new
{
Count = f.Count(),
Elem = f.Key
})
.OrderByDescending(g => g.Count)
.FirstOrDefault();
if (t == null)
{
return default(T);
}
else
{
return t.Elem;
}
}