c# – LINQ结果在for循环结束时发生变化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – LINQ结果在for循环结束时发生变化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3204字,纯文字阅读大概需要5分钟。
内容图文
![c# – LINQ结果在for循环结束时发生变化](/upload/InfoBanner/zyjiaocheng/804/e9bf73f8220a4c449a9f5a02e7d7275e.jpg)
当针对数据源执行一组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循环结束时发生变化全部内容,希望文章能够帮你解决c# – LINQ结果在for循环结束时发生变化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。