为什么用foreach和LINQ .Where()过滤时会得到不同的结果?

时间:2018-12-19 16:05:08

标签: 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

我正在尝试查找与我的firstGuess同名的商品。

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

经过.Where.Select的测试

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

1 个答案:

答案 0 :(得分: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();

ToList()确保IQueryable <>的执行位置

通常-如果您在类似这样的代码中发现了一些意外的情况-将var替换为显式类型-这很可能会使怪异显而易见。