C# 泛型方法可能引发异常

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 =>

我有一个全局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;
}
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确实如此。请参阅我的答案如何以另一种方式修复它。为了完成,我修复了它,以确保在调用该方法之前,我的集合中存在条目。谢谢你的每一个想法,祝你度过愉快的一天。