C# C LINQ-我可以在这里做些什么来提高性能?

C# C LINQ-我可以在这里做些什么来提高性能?,c#,performance,linq,C#,Performance,Linq,我正在对一个集合进行一些严格的过滤,它只不过是一个数据线条目的封装列表。 我需要在3个字段上“合并”这些行日期字符串、路由字符串和合并代码字符串 提取3个不同的列表工作得很快。我更担心的是三重foreach。。。 我想说一个普通的complete\u DealerCaseSetComplete包含5000个条目。 日期约为5天,路线约为100条,合并为350-500条 我写了以下方法。它完全符合我的要求,但计算速度非常慢。 也许你们可以指导我更快地执行代码 如果您需要任何其他代码,这是真正简单的

我正在对一个集合进行一些严格的过滤,它只不过是一个数据线条目的封装列表。 我需要在3个字段上“合并”这些行日期字符串、路由字符串和合并代码字符串

提取3个不同的列表工作得很快。我更担心的是三重foreach。。。 我想说一个普通的complete\u DealerCaseSetComplete包含5000个条目。 日期约为5天,路线约为100条,合并为350-500条

我写了以下方法。它完全符合我的要求,但计算速度非常慢。 也许你们可以指导我更快地执行代码

如果您需要任何其他代码,这是真正简单的事实上,请询问


看起来您正在尝试获取日期、路线和整合的每个不同组合

您当前的代码很慢,因为我认为它在^4上。您有三个嵌套循环,其主体是线性搜索

通过使用占用IEqualityComparer的Distinct重载,您可以获得更好的性能:


类DealerCaseComparer的实现与上面的MSDN链接中的实现类似。

看起来您需要按三个字段进行分组:

var filters = from r in _DealerCaseSetComplete.Data
              group r by new { 
                   r.DateAdded, 
                   r.Route, 
                   r.DealerConsolidationCode 
              } into g              
              select g.ToList();

foreach(List<DealerCaseLine> filter in filters)
    _LocalGridControl.Invoke(AddLineToDataGrid, filter);

您的代码将所有数据迭代三次以获得不同的字段。然后,当您使用where子句进行筛选时,它会迭代所有不同字段组合的所有数据。通过这三个字段进行分组,您将只迭代数据一次。每个结果组将至少有一个项目,所以在调用筛选器之前,您不需要检查组中是否有任何项目。

您的筛选器实际上是做什么的?看起来它实际上并没有过滤掉任何东西……看起来你可以边过滤边过滤,这样你就不必包括无效的路由等。@Moho我的过滤对象是我完整列表的过滤摘录。你得到的是所有不同的值,然后迭代这些不同值的每个可能组合-这将返回集合中的所有项。是的,你是对的,我正在尝试根据这3个值获取唯一或不同值的列表。我已将另一个标记为答案,因为它更适合这种情况。我做了一些关于iQualityComparer的研究,我可以肯定地看到它的用途。谢谢分享!谢谢,这正是我需要的。提速是巨大的!我不知道GROUPBY into子句返回了一个新的IEnuerable,而不是List;在这种情况下这是完美的。
var Consolidated = 
  _DealerCaseSetComplete.Data.Select(rec => rec).
  Distinct(new DealerCaseComparer());
var filters = from r in _DealerCaseSetComplete.Data
              group r by new { 
                   r.DateAdded, 
                   r.Route, 
                   r.DealerConsolidationCode 
              } into g              
              select g.ToList();

foreach(List<DealerCaseLine> filter in filters)
    _LocalGridControl.Invoke(AddLineToDataGrid, filter);