获取C#中键值对列表的所有可能组合

时间:2013-09-29 06:32:43

标签: c# algorithm list data-structures keyvaluepair

我有一个像这样的键值对:

var accounts = new List<KeyValuePair<int,int>>();

并且帐户的内容如下所示:

{[4,10000]}
{[4,19000]}
{[4,11000]}
{[4,12000]}
{[4,13036]}
{[4,47100]}
{[5,19300]}
{[5,32900]}
{[5,95800]}
{[6,95800]}

我如何获得accounts中的所有可能组合的密钥值对,以便我拥有:

[{4,10000},{5,19300},{6,95800}],
[{4,10000},{5,32900},{6,95800}].....

包含最终结果的数据结构对我来说并不重要,我只想尽可能高效地实现这一目标

1 个答案:

答案 0 :(得分:2)

在短暂搜索后,我发现您可以使用CartesianProduct Extension Method中的Eric Lippert's Blog来执行此操作:

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

正如:

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})); 
}