【问题标题】:c# - list of objects - group by - get distinct values by key - lambda / linqc# - 对象列表 - group by - 通过键获取不同的值 - lambda / linq
【发布时间】:2021-06-17 08:29:56
【问题描述】:

我尝试获取所有具有相同值的键。

数据:

public class CustItems
    {
        public string CustID { get; set; }
        public string ItemID { get; set; }
    }
List<CustItems> custItems = new List<CustItems>();
// GetData => fill list
custItems.Add(new CustItems { CustID = "1", ItemID = "1" });

项目数量:50'000, 客户数量:2'000

基本列表包含2个字段,意思是,哪个客户可以购买哪个商品

CustID ItemID
1 1
1 2
2 2
3 2
4 1
5 1
5 2
1 3
4 3
5 3

我试图找出哪些商品可以被同一客户购买

根据演示数据 客户 1,4,5 的项目 1 客户的项目 2 1,2,3,5 客户 1,4,5 的第 3 项

所以商品 1 和 3 可以由同一客户购买

不知道如何使用 lambda 或 linq 以高效的方式解决此问题。

非常感谢任何提示!非常感谢!

附言 从以下内容开始:

var groupedList = from c in custItems
                          group c by c.ItemID into grp
                          select new
                          {
                              ID = grp.Key,
                             
                              CustList = grp.Select(g => g.CustID).ToList()
                          };

但毕竟,CustList 包含所有客户的键(ItemID),但找不到好的方法来找出,哪些键(=Item)具有相同的值(=CustList)

【问题讨论】:

  • ...你想做什么?找到我们的哪些商品可以被哪些客户购买?找出哪些客户可以购买相同的商品?什么?
  • 您可以考虑GroupBy,然后检查集合。如果性能标准很严格,您可以检查特殊的相等检查算法,但分组部分必须相同。

标签: c# linq lambda


【解决方案1】:

由于您的 CustIDItemID 是字符串(在性能方面不是非常理想),我想出了以下 linq 解决方案:

var res = custItems
    .GroupBy(s => s.ItemID)
    .Select(g => new { ItemId = g.Key, Customers = g.Select(i => i.CustID).OrderBy(c => c).Aggregate((c0, c1) => $"{c0},{c1}") })
    .GroupBy(g => g.Customers)
    .Select(g => new { Customers = g.Key.Split(',').ToList(), Items = g.Select(i => i.ItemId).ToList() })
    .ToList();
  • 您首先将列表按ItemID 分组,以找出购买每件商品的所有客户
  • 然后您创建一个包含ItemID 和一组CustIDs 的匿名类型 - 我在这里使用了字符串连接,这是第一个需要改进的地方 - 转换一组可用于进一步分组的 ID
  • 然后按CustIDs 集对结果进行分组
  • 最后,您将您的 CustID 集带回 ID 列表,并将其存储在匿名类型中,其中包含这组客户购买的 CustIDs 列表和 ItemID 列表
  • 最后,您将所有内容转换为结构化浏览列表。

同样,可以优化合并和拆分客户(第 2 步和第 4 步)。

【讨论】:

  • 完美! - 非常感谢 - 这就是我想要的!
  • 很高兴我能帮上忙。请记住,您需要通过开发一组用于组合和重新组合客户 ID 的方法来改进此算法,并且最好不要使用字符串作为 ID。否则,您将面临巨大的性能影响。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2021-10-16
  • 2021-09-25
  • 2010-11-14
相关资源
最近更新 更多