寻找匹配属性时优化嵌套循环

问题描述 投票:0回答:1

我有一个实体框架查询,它在表之间进行一些联接,以提供一些数据,然后将其映射到对象列表。列表中的对象具有如下结构:

public ListObject
{
    public Panel Panel
    public Code Code
}

Panel 和 Code 只有简单的属性,如名称、Id 等

我正在循环对象列表并在将它们添加到数据集中之前进行一些处理。该代码如下所示:

foreach (var l in listObject)
{
  var codeString = string.Empty;

  if (l.Code != null)
  {
    listObject.Where(x => string.Equals(x.Code.Id, l.Panel.Id))
       .DistinctBy(x => x.Code.Name)
       .ForEach(x => codeString += $"{x.Code.Name},")
  }

  ...add to DataSet
}

这个想法是,如果我有类似的数据

面板:

Id

1
1
1
2

代码如下:

Id | Name

1  | hi
1  | hi
1  | hello
3  | bye

当添加到我的数据集时,对于每个插入的行,我都有完整的逗号分隔的不同名称的字符串。所以 Id 1 的行看起来像

Id | Names
1  | hi, hello
1  | hi, hello
1  | hi, hello
3  | bye

大多数时候,Code 对象为 null,并且在此列表上的处理速度非常快。在极少数情况下,我有 100,000 个面板和 100,000 个代码,这需要很长时间来处理,所以我正在研究如何优化它。

我已经考虑分解我的查询,以便我只有一个面板列表,然后我的代码进入字典并可以在那里进行更快的处理,但每次将其拆分为两个数据库查询似乎也不理想。有没有更好的方法来获取与面板关联的代码的不同名称?

c# .net loops optimization nested-loops
1个回答
1
投票

您可以尝试在 listObject 上使用

Linq for objects
,例如

var dict = listObject
  .Where(x => x.Code != null)
  .GroupBy(x => x.Code.Id, 
           x => x.Code.Name)
  .ToDictionary(group => group.Key, 
                group => string.Join(", ", group.Distinct()));

在这里,我将结果具体化为 dictionary

Key
id
Code.Id
Value
是逗号分隔的不同
Code.Name
s:

{ 1, "hi, hello" }
{ 3, "bye" }

然后你可以循环并添加到DataSet:

foreach (var l in listObject) {
  if (l.Code != null) {
    var id = l.Code.Id;
    var name = dict[l.Code.Id];

    ... Add to DataSet
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.