通用方法可能会抛出异常

时间:2016-05-20 07:38:46

标签: 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 => 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)

我怎样才能使这种方法安全? 我是否必须对此方法进行修复,或者更好地注意我发送给方法的数据?

2 个答案:

答案 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;
    }
}