使用LINQ从2D阵列中进行选择和排序

时间:2012-04-12 15:58:27

标签: c# linq

如果我有像这样的2D数组;

{
    {"12", "Animal", "Cat"}
    {"20", "Animal", "Dog"}
    {"6", "Vegetable", "Carrot"}
    {"5", "Mineral", "Iron"}
}

如何使用LINQ选择数据和orderby,比如第二个'列'? (最好是C#linq)

2 个答案:

答案 0 :(得分:6)

类似的东西:

var sorted = array.OrderBy(x => x[1])
                  .ToArray(); // Or ToList, or nothing...

“选择数据”并不清楚你的意思。就个人而言,我会尝试创建一个更强类型的数据模型,而不是每行都有一个字符串数组。当然,你也可以使用LINQ轻松地做到这一点:

var sorted = array.Select(row => new Item {
                             Id = int.Parse(row[0]),
                             Category = row[1],
                             Name = row[2]
                          });
                  .OrderBy(x => x.Category)
                  .ToArray();

编辑:对于第一个的查询表达式版本:

var sorted = (from x in array
              orderby x[1]
              select x).ToArray();

正如您所看到的,它比直接使用扩展方法更混乱。这两种形式都很舒服,因此您可以在任何特定情况下选择最简单的形式。

答案 1 :(得分:0)

即使它只是临时存储数据,我也会使用匿名类型来使代码更清晰,除非所需的最终结果是对字符串数据进行排序(即,如果您的任务是对文本文件进行排序)。

假设您有string[][]而非string[,],我会这样做:

var query = from row in array
            let record = new { ID = int.Parse(row[0]), Category = row[1], Name = row[2] }
            orderby record.Category
            select record;

var sortedData = query.ToArray();

扩展方法语法:

var sortedData = array
    .Select(row => new { ID = int.Parse(row[0]), Category = row[1], Name = row[2] })
    .OrderBy(record => record.Category)
    .ToArray();