2012-04-28 97 views
0

我想知道是否可以动态地执行以下查询。动态生成查询?

 var perms = from a in matrix[0] 
        from b in matrix[1] 
        from c in matrix[2] 
        select new[] { a, b, c}; 

矩阵是一个动态的对象,我想有相同的查询工作,无论矩阵的大小。

谢谢。

+2

我不完全知道你是问什么,Puhek ......你的意思是如果'matrix'中有两个元素,你只能选择'a'和'b',但如果它有三个元素,你可以选择'a'到'd'等。或者'矩阵'中总是存在三个元素,但其成员可能具有不同维度的集合? – 2012-04-28 20:36:35

+1

你为什么不尝试一下? – 2012-04-28 20:41:28

+0

对不起;矩阵实际上是一个[n] []对象。所以我得到的是n个不同大小的数组。我想要做的是做一个查询,动态地做内部数组上的所有排列。这个例子是为三个内部数组做的,我只是希望通常对任何Matrix [] []大小进行。 – Puhek 2012-04-28 20:59:22

回答

1

可以使用一个聚合器实现这一点:

IEnumerable<IEnumerable<int>> l = new[] { Enumerable.Empty<int>() }; 
var perms = matrix.Aggregate(l, (accumulator, seq) => 
    from a in accumulator from s in seq select a.Concat(new[] { s })); 
+0

谢谢!这会做。 – Puhek 2012-04-28 21:42:49

0

是否需要声明矩阵为dynamic?我觉得这个代码的工作,只要你想:

var matrix = new int[3][] { new int[] { 1 }, new int[] { 2, 2 }, new int[] { 3, 3, 3 } }; 
var perms = from a in matrix[0] 
      from b in matrix[1] 
      from c in matrix[2] 
      select new[] { a, b, c }; 
+0

对不起,我还不够清楚。并不是说对象本身是动态的,我想说我需要一个能够从三个“from”子句“动态”扩展到一般数量(并创建一个新数组)的查询。 – Puhek 2012-04-28 21:02:09