使用Linq和C#创建列表中项目的所有可能组合

vts*_*vts 6 c# linq algorithm list

我有一个类别表:

 Catid | Desciption
 1 | Color
 2 | Size
 3 | Material
Run Code Online (Sandbox Code Playgroud)

和一个类别项目表

 Catid | Name
 1 | Red
 1 | Blue
 1 | Green
 2 | Small
 2 | Med
 2 l Large
 3 | Cotton
 3 | Silk
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?谢谢

dtb*_*dtb 20

var result = list.GroupBy(t => t.Id).CartesianProduct();
Run Code Online (Sandbox Code Playgroud)

使用笛卡儿积扩展方法埃里克利珀的博客:

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})); 
}
Run Code Online (Sandbox Code Playgroud)

例:

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)));
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 我只是写了这个答案,+1来自我,因为他是第一个真正回答这个问题的人 (3认同)

Pra*_*ana 12

尝试交叉加入

var combo = from l1 in LIst1
            from l2    in List2
            select new {l1, l2};
Run Code Online (Sandbox Code Playgroud)

  • 在数学上,提问者可能会觉得有趣:交叉连接本质上是笛卡尔积(它将集合 A 中的所有元素与集合 B 中的所有元素以唯一对的形式组合在一起)。 (2认同)