C# 泛型方法可能引发异常
我有一个全局linq扩展方法,它从给定列表中检索最具代表性的元素。以下是示例:C# 泛型方法可能引发异常,c#,.net,linq,C#,.net,Linq,我有一个全局linq扩展方法,它从给定列表中检索最具代表性的元素。以下是示例: public static T GetMostRepresentedElement<T, U>(this IEnumerable<U> _Collection, Func<U, T> _GetElem) { return _Collection.GroupBy(e => _GetElem(e)) .Select(f =>
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;
}
public static T GetMostRepresentedElement(此IEnumerable\u集合,Func\u GetElem)
{
return\u Collection.GroupBy(e=>\u GetElem(e))
.选择(f=>new
{
Count=f.Count(),
Elem=f.键
})
.OrderByDescending(g=>g.Count)
.First()
埃伦先生;
}
这段代码可能会引发异常:
首先:序列不包含元素StackTrace:At
System.Linq.Enumerable.First[TSource](IEnumerable1 source)位于
IHMTools.Utilities.LinqExtensions.GetMostRepresentedElement[T,U](IEnumerable1)
_集合,Func2(GetElem)
我怎样才能使这种方法安全呢?
我是否必须对此方法进行修复,还是最好仔细了解我向该方法发送了哪些数据?如果集合为空,
First()
将抛出您收到的异常。您可以使用FirstOrDefault()
为空案例返回T
的默认值
由于您的LINQ非常复杂,您最好尽早退出以处理该案例,然后您也可以避免空案例,正如评论员所指出的那样。类似于
if(!\u Collection.Any())的东西返回默认值(T)代码>表达式的第一部分可能没有返回任何项。获取空集合的第一项将引发异常
您可以使用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;
}
}
public static T GetMostRepresentedElementStruct(此IEnumerable\u集合,Func\u GetElem)
{
var t=\u Collection.GroupBy(e=>\u GetElem(e))
.选择(f=>new
{
Count=f.Count(),
Elem=f.键
})
.OrderByDescending(g=>g.Count)
.FirstOrDefault();
如果(t==null)
{
返回默认值(T);
}
其他的
{
返回t.Elem;
}
}
请注意,获取null对象的元素将给您带来一个后续问题。刚刚注意到泛型类型是无界的,因此可能是结构,因此它可能不是null。@batwad确实如此。请参阅我的答案如何以另一种方式修复它。为了完成,我修复了它,以确保在调用该方法之前,我的集合中存在条目。谢谢你的每一个想法,祝你度过愉快的一天。