识别组合

时间:2013-11-28 03:59:10

标签: c# .net vb.net

我有一个与此处回答的问题相似但不完全相同的问题: 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一起订购,我想检查,如果组合出现,它是否完成整个订单? (意思是,它们是客户订购的唯一两种吗?)如果是这样,多少次? (该组合可能出现在多个客户订单中,但只有一个可能只订购了这两个订单)。

我真诚地感谢任何帮助。

3 个答案:

答案 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的键到字典。具有最高价值的组合最受欢迎。

如果没有实现你的类的代码,那么很难给你一个有意义的例子。不要担心长度。只要包含引用的每个类和方法。如果人们不得不猜测一个类或一个方法的作用,那么可能很难得到有意义的答案。