组成员的笛卡尔乘积

本文关键字:笛卡尔 组成员 | 更新日期: 2023-09-27 18:27:58

我在一个表中有两个或多个组,如下所示:

Id  Value GroupId
1   A       1
2   B       1
3   C       2
4   D       2

现在我想展示总的关系(总数:2*2=4,因为我们有两个小组,每个小组有两名成员),如下所示:

A & C 
A & D
B & C
B & D

或者有三组:

Id  Value GroupId
1   A       1
2   B       1
3   C       2
4   D       2
5   E       3
6   F       3

我们有2*2*2=8个关系:

A & C & E
A & D & E
B & C & E
B & D & E
A & C & F
A & D & F
B & C & F
B & D & F

但是,如何通过LinqExpression实现这一点?我希望结果显示在视图(剃刀)中。

更新:我的意思是表中的群成员的笛卡尔乘积。

组成员的笛卡尔乘积

将组分组为groups。将第一组移动到CCD_ 2中。然后,对于每个剩余的group,将它们与result:连接起来

        IEnumerable<string> result;
        var groups = (from item in list
                      group item by item.GroupId into grp
                      select grp.Select(t => t.Value)).ToList();
        result = groups.First();
        groups.RemoveAt(0);
        groups.ForEach(delegate(IEnumerable<string> value)
            {
                result = (from r in result
                         from v in value
                         select r + " " + v).ToList();
            });

我不确定我是否正确理解你的问题,但在我看来,它是来自不同组的元素的过滤笛卡尔乘积。如果是这样的话,这个代码可能会有所帮助:

var result = elements.SelectMany(x => elements, 
                                (x, y) => Tuple.Create(x, y))
                     .Where(t => t.Item1.GroupId < t.Item2.GroupId)
                     .Select(t => Tuple.Create(t.Item1.Value, t.Item2.Value))
                     .ToList();

注意:这会创建一些临时对象,因此在与非常大的集合一起使用时要注意。