none
C# Enumerable.Where() RRS feed

  • 问题

  • 请问,Enumerable 类别内的 Where()...

    这一段我不懂...是否可解释一下,谢谢。

    Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

    2012年11月6日 4:03

答案

  • Where是一个扩展方法。

    第一个参数,表明这个方法对谁扩展(凡是实现了IEnumerable<TSource>的,在3.5以及以上版本中一定涉及到此方法)。

    第二个参数,是一个泛型委托(第一个参数是IEnumerable泛型那个实际类型,而第二个则是根据某个条件判断该类型是否符合条件,符合返回true,否则false)。

    下面给出源代码:

    [__DynamicallyInvokable]
    public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        if (source != null)
        {
            if (predicate != null)
            {
                if (source as Enumerable.Iterator<TSource> == null)
                {
                    if (source as TSource[] == null)
                    {
                        if (source as List<TSource> == null)
                        {
                            return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
                        }
                        else
                        {
                            return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
                        }
                    }
                    else
                    {
                        return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
                    }
                }
                else
                {
                    return ((Enumerable.Iterator<TSource>)source).Where(predicate);
                }
            }
            else
            {
                throw Error.ArgumentNull("predicate");
            }
        }
        else
        {
            throw Error.ArgumentNull("source");
        }
    }


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    • 已标记为答案 weipxf 2012年11月6日 8:32
    2012年11月6日 4:34
    版主
  • 简单来说,扩展方法就是对某个类/接口或者是委托额外增加方法。Where这个方法就是一个例子:

    上面给出的是源代码而已——告诉你当使用Where之后内部是如何运行的。

    分别判断source究竟是一个数组,还是一个List,还是一个实现了IEnumerable接口的东东,分别调用不同的方法,配合predicate委托逐一判断是否符合筛选条件,然后返回一个IEnumerable的结果。


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    • 已标记为答案 weipxf 2012年11月6日 8:32
    2012年11月6日 7:54
    版主

全部回复

  • Where是一个扩展方法。

    第一个参数,表明这个方法对谁扩展(凡是实现了IEnumerable<TSource>的,在3.5以及以上版本中一定涉及到此方法)。

    第二个参数,是一个泛型委托(第一个参数是IEnumerable泛型那个实际类型,而第二个则是根据某个条件判断该类型是否符合条件,符合返回true,否则false)。

    下面给出源代码:

    [__DynamicallyInvokable]
    public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        if (source != null)
        {
            if (predicate != null)
            {
                if (source as Enumerable.Iterator<TSource> == null)
                {
                    if (source as TSource[] == null)
                    {
                        if (source as List<TSource> == null)
                        {
                            return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
                        }
                        else
                        {
                            return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
                        }
                    }
                    else
                    {
                        return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
                    }
                }
                else
                {
                    return ((Enumerable.Iterator<TSource>)source).Where(predicate);
                }
            }
            else
            {
                throw Error.ArgumentNull("predicate");
            }
        }
        else
        {
            throw Error.ArgumentNull("source");
        }
    }


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    • 已标记为答案 weipxf 2012年11月6日 8:32
    2012年11月6日 4:34
    版主
  • 请问这是一个方法?
    public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    2012年11月6日 5:39
  • 抱歉,你提供的 url 参考我又看了,里面的范例我看得懂,但你上面提供的范例...我还是不太理解...是否能麻烦...传一些参数...得到实际的值...谢谢。

     if (source != null)
        {
            if (predicate != null)
            {
                if (source as Enumerable.Iterator<TSource> == null)
                {
                    if (source as TSource[] == null)
                    {
                        if (source as List<TSource> == null)
                        {
                            return new Enumerable.WhereEnumerableIterator<TSource>(source, predicate);
                        }
                        else
                        {
                            return new Enumerable.WhereListIterator<TSource>((List<TSource>)source, predicate);
                        }
                    }
                    else
                    {
                        return new Enumerable.WhereArrayIterator<TSource>((TSource[])source, predicate);
                    }
                }
                else
                {
                    return ((Enumerable.Iterator<TSource>)source).Where(predicate);
                }
            }
            else
            {
                throw Error.ArgumentNull("predicate");
            }
        }
        else
        {
            throw Error.ArgumentNull("source");
        }



    • 已编辑 weipxf 2012年11月6日 7:07
    2012年11月6日 7:06
  • 简单来说,扩展方法就是对某个类/接口或者是委托额外增加方法。Where这个方法就是一个例子:

    上面给出的是源代码而已——告诉你当使用Where之后内部是如何运行的。

    分别判断source究竟是一个数组,还是一个List,还是一个实现了IEnumerable接口的东东,分别调用不同的方法,配合predicate委托逐一判断是否符合筛选条件,然后返回一个IEnumerable的结果。


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    • 已标记为答案 weipxf 2012年11月6日 8:32
    2012年11月6日 7:54
    版主