using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = "g";
string[] color = { "greena", "browna", "bluea" };
var query = color.Where(c => c.Contains(s));
Console.WriteLine(query.Count());
s = "a";
query = query.Where(c => c.Contains(s));
Console.WriteLine(query.Count());
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为它会输出应该跟随因为当query=color.where(c=>c.contains("g"))我认为它应该包含时{greena},所以当第二次查询运行query = query.where(c=>c.contains("a");时它只匹配绿色只有当计数为1时:
1
1
Run Code Online (Sandbox Code Playgroud)
但运行代码后的输出是
1
3
Run Code Online (Sandbox Code Playgroud)
为什么第二次过滤匹配所有元素(即使只有一个包含"g",第二个查询应该只看一个)?
Rob*_*Rob 11
您被捕获的变量咬了一口:
var query = color.Where(c => c.Contains(s));
Run Code Online (Sandbox Code Playgroud)
升降机s成闭合,并且读取的值s 在执行时.在这种情况下,这会在您重新分配s给其他内容后发生.
你最终得到的是你的查询:
var query = color.Where(c => c.Contains(s)).Where(c => c.Contains(s));
Run Code Online (Sandbox Code Playgroud)
而不是你可能期望的:
var query = color.Where(c => c.Contains("g")).Where(c => c.Contains("a"));
Run Code Online (Sandbox Code Playgroud)
这将产生您期望的结果:
string s = "g";
string[] color = { "greena", "browna", "bluea" };
var query = color.Where(c => c.Contains(s));
Console.WriteLine(query.Count());
var b = "a";
query = query.Where(c => c.Contains(b));
Console.WriteLine(query.Count()); // <-- This is where the entire expression is evaluated
Run Code Online (Sandbox Code Playgroud)