Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Where子句中比较两个属性和两个值之间的差异 请考虑以下陈述: var matches = person.Contacts.Where(c => c.ContactType == searchContact.ContactType).ToList();_C#_Linq - Fatal编程技术网

C# Linq Where子句中比较两个属性和两个值之间的差异 请考虑以下陈述: var matches = person.Contacts.Where(c => c.ContactType == searchContact.ContactType).ToList();

C# Linq Where子句中比较两个属性和两个值之间的差异 请考虑以下陈述: var matches = person.Contacts.Where(c => c.ContactType == searchContact.ContactType).ToList();,c#,linq,C#,Linq,这将过滤与searchContact对象的ContactType匹配的所有记录,并仅返回已过滤的person联系人。 但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人 现在,考虑下面的代码段。 Dictionary<int, string> colors = new Dictionary<int, string>(){ {1, "red"}, {2, "blue"}, {3, "green"}, {4, "yellow"}, {5,

这将过滤与searchContact对象的ContactType匹配的所有记录,并仅返回已过滤的person联系人。 但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人

现在,考虑下面的代码段。

Dictionary<int, string> colors = new Dictionary<int, string>(){ {1, "red"}, {2, "blue"}, {3, "green"}, {4, "yellow"}, {5, "red"}, {6, "blue"}, {7, "red"} };
var colorSet = colors.Where(c => c.Value == "red");
Dictionary colors=newdictionary(){1,“red”}、{2,“blue”}、{3,“green”}、{4,“yellow”}、{5,“red”}、{6,“blue”}、{7,“red”};
var colorSet=colors.Where(c=>c.Value==“红色”);
此查询将仅过滤值为“red”的元素,甚至不调用ToList()方法

我的问题是,为什么这两条语句(一条比较值,一条比较属性)在没有ToList()方法调用的情况下会以不同的方式运行? 为什么FirstOrDefault而不是Where子句不会出现此问题

我真的很感激,如果有人能解释这个场景或发布一些我可以遵循的参考资料。 谢谢

但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人

你错了。
ToList
只是强制迭代,并将过滤后的元素作为
列表提供给你
LINQ
使用延迟执行,这意味着直到你使用
foreach
循环迭代项目或使用
ToList
ToArray
方法,它没有执行。因此
ToList
不会更改您的项目
Value
也是一个属性(请参见
KeyValuePair
class),因此您在这两个查询中都基于属性值执行比较。没有任何区别

但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人

你错了。
ToList
只是强制迭代,并将过滤后的元素作为
列表提供给你
LINQ
使用延迟执行,这意味着直到你使用
foreach
循环迭代项目或使用
ToList
ToArray
方法,它没有执行。因此
ToList
不会更改您的项目
Value
也是一个属性(请参见
KeyValuePair
class),因此您在这两个查询中都基于属性值执行比较。没有任何区别

但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人

否,如果没有
ToList
,它将返回一个查询,在迭代时,该查询将生成与指定要筛选的值匹配的所有联系人。调用
ToList
只能将该查询具体化为该查询的结果。等待一段时间并在稍后进行迭代,可能使用其他迭代方法,例如
foreach
,只有在底层数据源(在本例中,从thigns的外观来看,是数据库)更改其数据时,才会更改结果

至于你的字典过滤器,同样的事情也适用。在不调用
ToList
的情况下,该变量表示在请求时获取数据的查询,而不是该查询的结果,这是通过调用
ToList
可以得到的结果

在这里,属性与字段的使用是无关的。话虽如此,两个查询都使用属性,而不是字段。即使一个人使用了一个字段,它也不会改变任何事情

但是如果Where子句末尾没有ToList()方法调用,它将返回person的所有联系人

否,如果没有
ToList
,它将返回一个查询,在迭代时,该查询将生成与指定要筛选的值匹配的所有联系人。调用
ToList
只能将该查询具体化为该查询的结果。等待一段时间并在稍后进行迭代,可能使用其他迭代方法,例如
foreach
,只有在底层数据源(在本例中,从thigns的外观来看,是数据库)更改其数据时,才会更改结果

至于你的字典过滤器,同样的事情也适用。在不调用
ToList
的情况下,该变量表示在请求时获取数据的查询,而不是该查询的结果,这是通过调用
ToList
可以得到的结果


在这里,属性与字段的使用是无关的。话虽如此,两个查询都使用属性,而不是字段。即使一个人确实使用了一个字段,它也不会改变任何事情。

你错了。如果不调用
ToList()
或其他方法强制立即执行,这两条语句都将返回
IQueryable
。在您使用
foreach
对查询变量进行迭代之前,查询变量将保持不变

这篇关于MSDN的文章应该很好地解释这一点:

您所经历的被称为延迟查询执行

在返回值序列的查询中,查询变量 它本身从不保存查询结果,只存储查询 命令。查询的执行延迟到查询变量 在foreach或For Each循环中迭代。这被称为 推迟执行

当您使用
ToList()
时,发生的情况称为立即查询执行

与产生 值序列,执行返回单例值的查询 马上。单例查询的一些示例包括Average、Count、, 第一个和最大值。由于查询必须 生成一个序列以计算单例结果。你也可以 强制立即执行。当您要缓存 查询的结果。强制立即执行不符合以下条件的查询: 如果不生成单例值,则可以调用ToList方法 ToDictionary方法,或查询或查询的ToArray方法