集团成员的笛卡尔积

时间:2014-10-26 21:59:24

标签: c# linq

我在表格中有两个或更多如下组:

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

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

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

但是,我怎么能通过 Linq Expression 来做到这一点?我希望结果显示在View(razor)中。

更新 我的意思是表中的Cartesian Product组成员。

2 个答案:

答案 0 :(得分:1)

将群组分组为groups。将第一组移至result。然后,对于每个剩余的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();

            });

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但在我看来,它是来自不同群体的元素的过滤笛卡尔积。如果是这样,这段代码可以提供帮助:

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

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