C#linq FirstOrDefault()

eba*_*eba 3 c# linq overloading

我从IEnumerable中选择一个double值,我怎么能重载FirstOrDefault()函数,在默认情况下返回null,而不是零,我喜欢这样的东西:

double? x = from ... .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

我现在可以捕捉异常,并写双?x = null,但我有20个变量,而不是它的方式

Eri*_*ert 16

不要抓住异常.异常的目的是告诉您有一个错误,而不是作为控制流.

编写自己的扩展方法可以非常直接地执行您想要的操作,所以这样做:

public static double? FirstOrNull(this IEnumerable<double> items)
{
    foreach(double item in items)
        return item;
    return null;
} 
Run Code Online (Sandbox Code Playgroud)

或者,如果你想成为它的爱好者:

public static T? FirstOrNull<T>(this IEnumerable<T> items) where T : struct
{
    foreach(T item in items)
        return item;
    return null;
} 
Run Code Online (Sandbox Code Playgroud)

合理?


Ani*_*Ani 10

为什么不这样做:

double? x = myDoubles.Cast<double?>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)


cry*_*ted 5

您可以编写以下扩展方法,我只是使用Reflector翻录Code of FirstOrDefault方法并进行修改以满足您的要求.

public static class MyExtension
{
    public static TSource? NullOrFirst<TSource>(this IEnumerable<TSource> source) where TSource : struct
    {
        if (source == null)
        {
            throw new ArgumentNullException("source");
        }
        IList<TSource> list = source as IList<TSource>;
        if (list != null)
        {
            if (list.Count > 0)
            {
                return list[0];
            }
        }
        else
        {
            using (IEnumerator<TSource> enumerator = source.GetEnumerator())
            {
                if (enumerator.MoveNext())
                {
                    return enumerator.Current;
                }
            }
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)