我有一个与此处回答的问题相似但不完全相同的问题: Fastest way to identify the combinations of items
我将首先解释背景。
我有不同客户发出的采购订单,其中包含客户ID和他们希望购买的商品。 (下面的示例格式 - 类似于上面提到的问题)
CUS#,ITEM
1, Soap
1, Brush
2, Brush
2, Toothpaste
2, Razor
2, Razor Blades
3, Razor Blades
3, Razor
任何客户都可以订购任意数量的商品(如上例Cus1-2items,Cus2-4items)。
我正在尝试识别在不同客户中非常受欢迎的项目组合。以下列出了特定客户的所有项目组合及其外观数量。
Razor , Razor Blades - 2 Customers
Soap, Brush - 1 Customer
Brush, Toothpaste- 1 Customer
Brush, Razor - 1 Customer
Brush, Razor Blades - 1 Customer
Toothpaste , Razor - 1 Customer
Toothpaste , Razor Blades - 1 Customer
我尝试通过以下逻辑(伪代码)执行此操作:
对于每个Customer_ID:
Identify_The_Combinations_Of_Orders
For Each Combination:
Check if the combination already exists, if yes, count one more, if no, start counting from 1
此代码易于实现,但执行时间较长。有没有更智能的方法来执行.NET?
现在,我想要检查的是订单完成情况。如果Razor和Razor Blades一起订购,我想检查,如果组合出现,它是否完成整个订单? (意思是,它们是客户订购的唯一两种吗?)如果是这样,多少次? (该组合可能出现在多个客户订单中,但只有一个可能只订购了这两个订单)。
我真诚地感谢任何帮助。
答案 0 :(得分:1)
使用以下代码:
List<dynamic> lstOrders = new List<dynamic>();
lstOrders.Add(new { CustID = 1, Item = "Soap" });
lstOrders.Add(new { CustID = 1, Item = "Brush" });
lstOrders.Add(new { CustID = 2, Item = "Brush" });
lstOrders.Add(new { CustID = 2, Item = "Toothpaste" });
lstOrders.Add(new { CustID = 2, Item = "Razor" });
lstOrders.Add(new { CustID = 2, Item = "Razor Blades" });
lstOrders.Add(new { CustID = 3, Item = "Razor" });
lstOrders.Add(new { CustID = 3, Item = "Razor Blades" });
var items = lstOrders.Select(x => x.Item).Distinct();
var orders = lstOrders.SelectMany((value, index) => lstOrders.Skip(index + 1),
(first, second) => new { Item1 = first, Item2 = second }).Where(x => x.Item1.CustID == x.Item2.CustID);
var combinations = from r in orders
select new { CustID = r.Item1.CustID, Combination = new { Item1 = r.Item1.Item, Item2 = r.Item2.Item } };
var group = combinations.GroupBy(x => x.Combination);
foreach (var grpItem in group)
{
Console.WriteLine(string.Format("Item combination {{{0}, {1}}} has been purchased by {2} customer(s).", grpItem.Key.Item1, grpItem.Key.Item2, grpItem.Count()));
}
Console.Read();
答案 1 :(得分:0)
我没有足够的代表发表评论,所以我会在这里问我的问题。您是否拥有算法的代码示例以检查组合。按理说,如果这就是你遇到的问题,那就是我们最需要的细节。
例如,您的商品是否具有唯一ID?你如何存储数据?如何搜索组合元数据,或者每次都搜索每个采购订单?
答案 2 :(得分:0)
最简单的方法之一是使用Dictionary(Of List(Of String),Integer),如果转换为字符串列表的组合已经在字典中,则将值增加1,否则将列表添加为键值为1的键到字典。具有最高价值的组合最受欢迎。
如果没有实现你的类的代码,那么很难给你一个有意义的例子。不要担心长度。只要包含引用的每个类和方法。如果人们不得不猜测一个类或一个方法的作用,那么可能很难得到有意义的答案。