C# 使用LINQ从二维阵列中进行选择和排序
如果我有这样一个2D字符串数组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();
{
{"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”的定义。。。