为什么我使用 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
替换为显式类型 - 这很可能会使奇怪之处显而易见。
我似乎在过滤时得到了不同的结果。
我希望这两段代码的结果相同 :
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
替换为显式类型 - 这很可能会使奇怪之处显而易见。