【问题标题】:Create all possible combinations of items in a list using Linq and C# [duplicate]使用 Linq 和 C# 在列表中创建所有可能的项目组合 [重复]
【发布时间】:2021-01-17 02:17:11
【问题描述】:

我有一个类别表:

 Catid | Desciption
 1 | Color
 2 | Size
 3 | Material

还有一个类别项目表

 Catid | Name
 1 | Red
 1 | Blue
 1 | Green
 2 | Small
 2 | Med
 2 l Large
 3 | Cotton
 3 | Silk

我需要遍历所有项目并将它们显示在这样的标签中:

 Red Small Cotton
 Red Small Silk
 Red Med Cotton
 Red Med Silk
 Red Large Cotton
 Red Large Silk
 Blue Small Cotton
 Blue Small Silk
 Blue Med Cotton
 Blue Med Silk
 Blue Large Cotton
 Blue Large Silk
 Green Small Cotton
 Green Small Silk
 Green Med Cotton
 Green Med Silk
 Green Large Cotton
 Green Large Silk

请注意:类别可能更多或更少。它不是预先确定的。

有什么建议吗? 谢谢

【问题讨论】:

  • 请注意:可能有更多或更少的类别。它不是预先确定的。

标签: c# linq algorithm list


【解决方案1】:
var result = list.GroupBy(t => t.Id).CartesianProduct();

使用来自Eric Lippert's BlogCartesianProduct Extension Method

static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
  this IEnumerable<IEnumerable<T>> sequences) 
{ 
  IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
  return sequences.Aggregate( 
    emptyProduct, 
    (accumulator, sequence) => 
      from accseq in accumulator 
      from item in sequence 
      select accseq.Concat(new[] {item})); 
}

例子:

var list = new[]
{
    new { Id = 1, Description = "Red"    },
    new { Id = 1, Description = "Blue"   },
    new { Id = 1, Description = "Green"  },
    new { Id = 2, Description = "Small"  },
    new { Id = 2, Description = "Med"    },
    new { Id = 2, Description = "Large"  },
    new { Id = 3, Description = "Cotton" },
    new { Id = 3, Description = "Silk"   },
};

var result = list.GroupBy(t => t.Id).CartesianProduct();

foreach (var item in result)
{
    Console.WriteLine(string.Join(" ", item.Select(x => x.Description)));
}

输出:

Red Small Cotton
Red Small Silk
Red Med Cotton
Red Med Silk
Red Large Cotton
Red Large Silk
Blue Small Cotton
Blue Small Silk
Blue Med Cotton
Blue Med Silk
Blue Large Cotton
Blue Large Silk
Green Small Cotton
Green Small Silk
Green Med Cotton
Green Med Silk
Green Large Cotton
Green Large Silk

【讨论】:

  • 我只是在写这个答案,我是第一个真正回答这个问题的人 +1
  • 谢谢。这几乎可以工作。但我也得到了这些结果:红色、蓝色、绿色、红色小号红色中号红色大号蓝色小号、蓝色中号、蓝色大号、绿色小号、绿色中号、绿色大号,关于如何删除这些组合的任何想法?
  • @user1095952:我没有得到这些结果;我的示例程序给出了如上所示的输出。显示您的代码。
  • 新博客链接:ericlippert.com/2010/06/28/…
【解决方案2】:

尝试使用交叉连接:

var combo = from l1 in List1
            from l2 in List2
            select new {l1, l2};

【讨论】:

  • 在数学上,提问者可能会觉得有趣:交叉连接本质上是笛卡尔积(它将集合 A 中的所有元素与集合 B 中的所有元素以唯一的对组合)。跨度>
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多