可以将2d数组转换为可用列表

时间:2013-10-07 19:02:09

标签: linq c#-3.0

我有一个二维数组,其值如下:

[0,1] = "A"
[0,2] = "A"
[0,3] = "A"
[0,4] = "A"
[0,5] = "A"
....
[1,0] = "1"
[1,1] = "2"
[1,2] = "3"
...
[2,0] = "N"
[2,1] = "N"
[2,2] = "N"
[2,3] = "N"
... So on.

有没有办法将其转换为3个单独的列表,如list1将具有[0,1] [0,2]的所有值......等等。和List2的值为[1,0] [1,1] ......等等。我试过这个:

List<string> cList = class.KVal.Cast<string>().ToList();

这给了我一个列表,但它不可用,因为我无法对此进行操作,因为它已将所有值存储在一个列表中。

我正在尝试以下代码:

 var theList = Enumerable.Range(0, table.KVal.GetLength(1) - 1)
                                         .Where(i=> table.KVal[0, i].Contains("A"))
                                         .ToList();

而且我得到了所有的A值,我希望它是从下一个2d数组中获取值的基本索引,如上所述,代码从1开始获取值。我希望它获得完全相同的值上面的代码得到了。

所以我这样做:

var index = Enumerable.Range(0, table.KVal.GetLength(1) - 1)
                                         .Where(i=> table.KVal[0, i].Contains("A"))
                                         .ToArray();

我不确定如何实现此数组以获取其他值。

1 个答案:

答案 0 :(得分:2)

您始终可以使用Enumerable.Range

var list1 = Enumerable
    .Range(1, table.KVal.GetLength(1) - 1) // if you want to start at [0, 1]
    .Select(i => table.KVal[0, i])
    .ToList();
var list2 = Enumerable
    .Range(0, table.KVal.GetLength(1))     // if you want to start at [1, 0]
    .Select(i => table.KVal[1, i])
    .ToList();

等等。

请注意,您实际上可以使用此技术使用 n 迭代器遍历数组:

var results = 
    from x in Enumerable.Range(0, table.KVal.GetLength(0))
    from y in Enumerable.Range(0, table.KVal.GetLength(1))
    select table.KVal[x, y]; 

这是一个非常简单的示例,但它说明了如何在单个Linq查询中访问多维数组。