C# 使用LINQ从二维阵列中进行选择和排序

C# 使用LINQ从二维阵列中进行选择和排序,c#,linq,C#,Linq,如果我有这样一个2D字符串数组 { {"12", "Animal", "Cat"} {"20", "Animal", "Dog"} {"6", "Vegetable", "Carrot"} {"5", "Mineral", "Iron"} } 如何使用LINQ选择数据和orderby,比如第二列?C linq最好类似于: var sorted = array.OrderBy(x => x[1]) .ToArray();

如果我有这样一个2D字符串数组

{
    {"12", "Animal", "Cat"}
    {"20", "Animal", "Dog"}
    {"6", "Vegetable", "Carrot"}
    {"5", "Mineral", "Iron"}
}
如何使用LINQ选择数据和orderby,比如第二列?C linq最好类似于:

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();
正如您所看到的,它比直接使用扩展方法更混乱。这两种形式都值得一试,因此您可以在任何给定情况下选择最简单的一种形式。

类似于:

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();

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

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

假设您有一个字符串[],而不是字符串[],我会这样做:

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();

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

假设您有一个字符串[],而不是字符串[],我会这样做:

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();

数组的数组是一种不好的代码味道,通常您希望创建真实的类并保留这些类的列表。它只是多分隔字符串的临时存储。数组的数组是一种不好的代码味道,通常,您希望创建真正的类并保留这些类的列表。这只是多分隔字符串的临时存储,不需要吹毛求疵,但select语句后有一个错误的分号。谢谢,我尝试使用内嵌linq而不是扩展方法来实现这一点。出于兴趣,使用内联语句的等价物是什么?@Rob2211:我已经编辑了-我建议您在这种情况下使用扩展方法语法。非常感谢您提供的全面答案。我同意在这种情况下,扩展方法更优雅,表达版只是为了真正学习。再次感谢。@Jon Skeet,这种方式对我不起作用。错误:“string[,]”不包含“OrderBy”的定义…不要吹毛求疵,但select语句后有一个错误的分号。谢谢,我尝试使用内嵌linq而不是扩展方法来完成此操作。出于兴趣,使用内联语句的等价物是什么?@Rob2211:我已经编辑了-我建议您在这种情况下使用扩展方法语法。非常感谢您提供的全面答案。我同意在这种情况下,扩展方法更优雅,表达版只是为了真正学习。再次感谢。@Jon Skeet,这种方式对我不起作用。错误:“字符串[,]”不包含“OrderBy”的定义。。。