【发布时间】:2014-03-20 18:30:46
【问题描述】:
当对数据源执行一组 LINQ 查询时(我使用的是 LINQ-to-SQL,但这里也发生了仅使用 List<string> 对象),我最终得到不同的结果我的支票。
具体来说,下面的代码试图找出一个完全合格的域名 (FQDN) 是否存在于主机名列表中(并非所有这些都是 FQDN 或在同一个域中,但重要的是主机标识符对我来说)。搜索试图查找列表中是否存在"host-6.domain.local" 或其任何子组件(即"host-6.domain" 或"host-6"),但它们不存在。在 for 循环中,我们得到了我们期望的结果,但是一旦 for 循环完成,我得到一个包含列表内容的 all 的结果,对我来说这听起来像它正在尝试查找与空字符串匹配的元素。
void MyMethod()
{
string fqdn = "host-6.domain.local";
string[] splitFqdn = fqdn.Split('.');
List<string> values = new List<string>();
values.add("host-1");
values.add("host-2.domain.local");
values.add("host-3.domain.local");
values.add("host-4");
values.add("host-5.other.local");
IEnumerable<string> queryResult = null;
for (int i = splitFqdn.Length; i > 0; i--)
{
result =
from value in values
where value.StartsWith(
string.Join(".", splitFqdn.Take(i)))
select value;
Console.WriteLine(
"Inside for loop, take " + i + ": " + result.Count());
}
Console.WriteLine();
Console.WriteLine(
"Outside for loop: " + result.Count());
}
为什么会发生这种情况?如何获得在 for 循环完成后仍可以访问的准确结果?
【问题讨论】:
-
当循环退出时,
i将等于 0,这使得所有值都匹配(它们都以空字符串开头)由于result被延迟评估,这就是results.Count()将循环退出后计数。