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

ani*_*ita 5 c# linq foreach sitecore

过滤时我似乎得到了不同的结果.我希望这两段代码得到相同的结果:

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
Run Code Online (Sandbox Code Playgroud)

我想找到与我同名的物品firstGuess.

方法A按预期工作,而B似乎给我一个奇怪的结果是!matches2.any()返回false,当我希望true.

.Where和测试.Select

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

Mem*_*per 1

没有更多信息很难说,但你可以尝试这个,即确保你不会遭受 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();
Run Code Online (Sandbox Code Playgroud)

ToList()也是确保 IQueryable<> 明确执行的地方

一般来说 - 如果你在这样的代码中发现一些意想不到的东西 - 替换var 为显式类型 - 这很可能会使奇怪的现象变得明显。

  • @anita如果“ToList”有效,那么问题就是我在评论中告诉你的:Linq 查询是延迟加载的,这意味着,当您使用“Where”时,它实际上不执行任何操作。仅当您迭代 IEnumerable 时,“Where”操作的结果才可见。因此,如果您在迭代(或 Any())之前修改“firstGuess2.Parent.Children.InnerChildren”,您最终会得到“意外结果”。ToList() 强制它立即评估Where。 (2认同)