从第一列值匹配的2d object []中选择整行

时间:2015-06-16 13:47:56

标签: linq

我有一个包含类似内容的2D对象数组:

Filename | "filename.txt" | 1
Path     | "C:\temp\"     | 2
Date     | 16/06/2015     | 3

我想从这个数组中提取与给定标题匹配的行,其中标题是第一列的值。例如,给定'Path',我想给出:

Path | "C:\temp\"  | 2

我正在循环查找正确的行号,然后循环遍历该行以提取它。我很确定使用linq可以让它看起来更漂亮,但我对它的使用很少。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果你使用的是锯齿状数组,那就相当简单了:

object[][] jagged = { new object[]  {"Filename", "filename.txt", 1},
                      new object[] {"Path", @"C:\Temp", 2},
                      new object[] {"Date", new DateTime(2015,6,16), 3}};

var q = from j in jagged
        where (j[0] as string) == "Path"
        select j;

var row = q.FirstOrDefault();
// row is an object[3] array
事实上,这可以简化为:

var row = jagged.FirstOrDefault(j =>(j[0] as string) == "Path");

但是,如果你使用的是rectangluar数组,它会变得更加丑陋。矩形数组没有“行”或“列”的概念,只有单元格,因此您需要构建一个新数组:

object[,] rect = { { "Filename", "filename.txt", 1},
                    {"Path", @"C:\Temp", 2},
                    {"Date", new DateTime(2015,6,16), 3}};

var result = new object[rect.GetLength(1)];

for(int i = rect.GetLowerBound(0); i <= rect.GetUpperBound(0); ++i)
{
    if (rect[i, rect.GetLowerBound(1)] as string == "Path")
    {
        for (int j = 0; j < rect.GetLength(1); ++j)
            result[j] = rect[i, rect.GetLowerBound(1) + j];
        break;
    }
}