gpt4 book ai didi

c# - LINQ 结果在 for 循环结束时改变

转载 作者:太空狗 更新时间:2023-10-30 00:41:09 25 4
gpt4 key购买 nike

当对数据源执行一组 LINQ 查询时(我使用的是 LINQ-to-SQL,但这里也只使用 List<string> 对象),最后我得到了不同的结果我的支票。

具体来说,下面的代码试图查找主机名列表中是否存在完全限定的域名 (FQDN)(并非所有主机名都是 FQDN 或在同一域中,但主机标识符很重要大部头书)。搜索试图找到是否 "host-6.domain.local"或其任何子组件存在于列表中(即 "host-6.domain""host-6" ),但它们不存在。在 for 循环中,我们得到了我们期望的结果,但是一旦 for 循环结束,我得到的结果包含列表的所有内容,这对我来说听起来像它正在尝试查找与空字符串匹配的元素。

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 循环结束后仍可访问的准确结果?

最佳答案

您正被 LINQ 的惰性执行和关闭所困扰。

当你像你在这里做的那样创建一个枚举时......

result =  
from value in values
where value.StartsWith(
string.Join(".", splitFqdn.Take(i)))
select value;

它不会被评估,直到你做了一些强制它被评估的事情......例如当你做 result.count()

然后当您再次评估它时,稍后在您的循环之外 result.count() 将使用您的 for 循环中存在的 i 的最后一个值进行评估,这不会给您您想要的。

尝试通过对您的可枚举对象执行 .ToList() 来强制求值...此代码显示两个值,以便您进行比较。

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;
List<string> correctResult = null;
for (int i = splitFqdn.Length; i > 0; i--)
{
queryResult =
from value in values
where value.StartsWith(
string.Join(".", splitFqdn.Take(i)))
select value;
correctResult = queryResult.ToList();
Console.WriteLine(
"Inside for loop, take " + i + ": " + queryResult.Count());
}
Console.WriteLine();
Console.WriteLine(
"Outside for loop queryResult: " + queryResult.Count());
Console.WriteLine(
"Outside for loop correctResult: " + correctResult.Count());
}

编辑:感谢 nlips 指出我没有完全回答这个问题...并为转换为方法语法而道歉,但转换为查询语法需要更长的时间。

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");
values.Add("host-5.other.local");
IEnumerable<string> queryResult = null;
List<string> correctResult = new List<string>();
for (int i = splitFqdn.Length; i > 0; i--)
{
correctResult = correctResult
.Union(values.Where(
value => value.StartsWith(string.Join(".", splitFqdn.Take(i)))))
.ToList();
}
}

关于c# - LINQ 结果在 for 循环结束时改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com