Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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链式选择和区别运算符_C#_Linq - Fatal编程技术网

C# Linq链式选择和区别运算符

C# Linq链式选择和区别运算符,c#,linq,C#,Linq,我是LINQ的新手,有一个基本的问题 假设我有一个很大的客户对象列表 List<Customer> c = null; c = //Fetch from DB - resulting into 1000+ non-unique Customers; CustomerEntityComparer只是一个基于CustomerID比较两个CustomerEntity对象的类。 我的问题是: 如果将Select和Distinct链接起来,是否会导致列表多次迭代 谢谢 维卡斯给出了一个更详细

我是LINQ的新手,有一个基本的问题

假设我有一个很大的客户对象列表

List<Customer> c = null;
c = //Fetch from DB - resulting into 1000+ non-unique Customers;
CustomerEntityComparer只是一个基于CustomerID比较两个CustomerEntity对象的类。 我的问题是: 如果将Select和Distinct链接起来,是否会导致列表多次迭代

谢谢


维卡斯给出了一个更详细的回答:
您可以注意到Select()返回IEnumerable,Distinct()也返回IEnumerable。这是因为您基本上是在创建查询。在调用ToList()方法之前,不会执行任何选择或不同的筛选。当执行ToList()方法时,将计算整个查询。这叫做延迟执行

这样做的好处是,您可以创建如下查询:

var ceQuery = c.Select(cust => new CustomerEntity() 
{
    CustomerID = cust.CustID,
    CustomerName = cust.CustName
}).Distinct(new CustomerEntityComparer());
然后每次更改“c”时,您都可以重新使用相同的ceQuery来获取最新的restul:

var ce = ceQuery.ToList();

问题是什么?你做了什么来研究它?简单的回答是:没有。但是你可以在数据库端进行这些转换(
选择DISTINCT
)。如果你想更多地了解LINQ(对象)的内部工作原理,我推荐Jon Skeet重新发明LINQ并解释所有涉及的原则(例如,当列表实际被迭代时)。但简单的答案是,它只会迭代原始列表一次。谢谢Chris。我会检查该链接。很酷。谢谢。我知道在LINQ To SQL的情况下,查询会转换为表达式树,然后在请求exec时,该树用于生成SQL。我还知道L2Object的延迟执行方面。但我不确定在L2Object的情况下,2个链式调用实际上只会在集合上迭代一次,即使延迟执行也是如此。我怀疑的是,这是因为执行了SELECT&DISTINCT操作。因此,我想再次检查。
var ce = ceQuery.ToList();