C# 为什么这三段LINQ代码会产生不同(或错误)的结果?

C# 为什么这三段LINQ代码会产生不同(或错误)的结果?,c#,linq,enumeration,C#,Linq,Enumeration,以下是一些示例数据: List<Book> books = new List<Book>() { new Book(){Title = "artemis fowl: the time paradox", Pages = 380}, new Book(){Title = "the lieutenant", Pages = 258}, new Book(){Title = "the wheel of time", Pages = 1032},

以下是一些示例数据:

List<Book> books = new List<Book>()
{
    new Book(){Title = "artemis fowl: the time paradox", Pages = 380},
    new Book(){Title = "the lieutenant", Pages = 258},
    new Book(){Title = "the wheel of time", Pages = 1032},
    new Book(){Title = "ender's game", Pages = 404},
    new Book(){Title = "the sphere",  Pages = 657}
};  

第一个注释掉的片段触发一个索引器超出范围异常,声明i的值为2

第二个注释掉的部分运行并产生输出,但它打印出5本书中的4本。。。除了那本名为《安德的游戏》的书之外。那是不对的

所以,翻阅我的帖子,我发现我不能控制自己解释每一个细节的坏习惯


好了。请解释为什么输出不同。我想您可能会对我当前的“解决方案”做出一些改进。

既然我们在这里使用LINQ to对象,您应该能够使用
All()
。这样就不需要循环了

var query = books.Where(book => filters.All(filter => filter(book.Title)));
这相当于:

var query = from book in books
            where filters.All(filter => filter(book.Title))
            select book;
至于为什么其他尝试不起作用,你是。一般来说,在循环中使用lambda函数时应该小心,因为这样做。简单的修复方法是声明一个单独的变量,您可以在lambda中使用它。请注意,您在第一个查询中实际上间接地做到了这一点。但是,您根本不需要循环,应该使用上面的查询之一

for (int i = 0; i != filters.Count; ++i)
{
    var index = i;
    q = q.Where(b => filters[index](b.Title));
}

foreach (Func<string, bool> f in filters)
{
    var filter = f;
    q = q.Where(b => filter(b.Title));
}
for(int i=0;i!=filters.Count;++i)
{
var指数=i;
q=q.Where(b=>filters[index](b.Title));
}
foreach(过滤器中的函数f)
{
var滤波器=f;
q=q.Where(b=>filter(b.Title));
}

它们都是。这就是问题所在:(
            //This produces an exception...
            //Due to index in query?
//            for (int i = 0; i != filters.Count; ++i)
//            {
//                q = q.Where(b => ((filters[i])(b.Title)));
//            }
            //This runs but doesn't produce the proper output
//            foreach (Func<string, bool> filter in filters)
//              q = q.Where(b => filter(b.Title));
foreach (Book b in q)
{
    Console.WriteLine("Title:\t\t{0}\nPages:\t\t{1}\n",
                      b.Title, b.Pages);
}
var query = books.Where(book => filters.All(filter => filter(book.Title)));
var query = from book in books
            where filters.All(filter => filter(book.Title))
            select book;
for (int i = 0; i != filters.Count; ++i)
{
    var index = i;
    q = q.Where(b => filters[index](b.Title));
}

foreach (Func<string, bool> f in filters)
{
    var filter = f;
    q = q.Where(b => filter(b.Title));
}