我在表格中有两个或更多如下组:
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组成员。
答案 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();
注意:这会创建一些临时对象,因此在使用非常大的集合时要注意。