为什么我使用 foreach 与 LINQ .Where() 过滤得到不同的结果?

Why am I getting different results filtering with foreach vs LINQ .Where()?

我似乎在过滤时得到了不同的结果。

我希望这两段代码的结果相同 :

Sitecore.Data.Items.Item firstGuess = Sitecore.Context.Database.GetItem(mediaPath);
var matches = new List<Item>();

//Method A
foreach (var child in firstGuess.Parent.Children.InnerChildren)
{
    if (child.DisplayName == firstGuess.DisplayName)
    {
            matches.Add(child);
    }
} 
//Matches.count  = 2

//Method B
var matches2 = firstGuess.Parent.Children.InnerChildren.Where(i => i.DisplayName == firstGuess.DisplayName);
//matches2.any = false

我正在尝试查找与我的 firstGuess.

同名的项目

方法 A 按预期工作,但 B 似乎给了我一个奇怪的结果 !matches2.any() returns false,而我期望 true.

同时测试了 .Where.Select

为什么这些看似相同的方法给我不同的结果

如果没有更多信息很难说,但你可以试试这个,即确保你不会在 foreach 循环中遭受 firstGuess 突变的困扰。得到结果两次。

var firstGuess = Sitecore.Context.Database.GetItem(mediaPath);
var firstGuess2 = Sitecore.Context.Database.GetItem(mediaPath);
var matches = new List<Item>();

//Method A
foreach (var child in firstGuess.Parent.Children.InnerChildren)
{
    if (child.DisplayName == firstGuess.DisplayName)
    {
        matches.Add(child);
    }
} //Matches.count  = 2

//Method B
var matches2 = firstGuess2.Parent.Children.InnerChildren.Where(i => i.DisplayName == firstGuess.DisplayName).ToList();

还有 ToList() 确保 IQueryable<> 确实执行的地方

通常 - 如果您在这样的代码中发现一些意想不到的东西 - 将 var 替换为显式类型 - 这很可能会使奇怪之处显而易见。