2014-10-26 144 views
0

我有一个像下面的表2个或以上的团体:笛卡尔乘积为小组成员

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表达式做到这一点?我希望结果在View(剃须刀)中显示。

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

+1

目前尚不清楚你所使用的“状态”在这里的意思是......你的意思是选择来自各组一个项目?这些数据来自哪里? (在LINQ to SQL中使用可能比较棘手,但在LINQ to Objects中相对比较简单 – 2014-10-26 22:03:00

+0

@JonSkeet状态是指成员之间根据组的关系建立的全部关系,从每个组中选择一个条目与每个组成员一起显示数据来自数据库 – 2014-10-26 22:07:14

+0

我强烈建议你举三个例子,目前你的问题还不太清楚, – 2014-10-27 11:01:25

回答

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

      }); 
+0

我测试过你的,没有任何意义。你确定它的真正逻辑/语法吗? – 2014-11-04 23:15:22

+0

我以为你只是想要点数。我会尝试编辑我的答案 – 2014-11-05 00:13:49

+0

请检查编辑 – 2014-11-08 06:48:37

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

:此创建了非常大的收藏品时,使用一些临时的对象,所以要注意。

+0

如果有三个组,我想这个OP需要三个值的元组,例如 – 2014-10-26 22:35:45

+0

@JonSkeet,真的,我们不知道,我明白这一点,让我们等待OP澄清... – 2014-10-27 09:14:10

+0

OP已经澄清它 – 2014-10-27 11:14:00