我有这个功能,需要一个列表,需要按名称按升序排序,我从前一个函数中获取了查询,但现在我坚持我必须改变它以使其工作因为我不知道Linq,这是功能:
((IEnumerable<string>)Directory.GetFiles(Directories, "*.sql", SearchOption.TopDirectoryOnly))
我只想从列表中选择,因此不需要import Foundation
import CoreData
struct Stop {
var name: String;
var id: String;
}
class Favourite: NSManagedObject {
@NSManaged var name: String
@NSManaged var id: String
var stop : Stop {
get {
return Stop(name: self.name, id: self.id)
}
set {
self.name = newValue.name
self.id = newValue.id
}
}
}
。
我想将我传递给函数的列表作为参数排序,文件命名如下:1_ORCA_3-9_56.sql第一个数字表示文件的执行顺序,所以我需要对文件进行排序以该名称升序
我实际上会传递一个包含3个需要排序的列表的结构
文件名是完整路径
答案 0 :(得分:2)
如果列表中的文件可能没有所需的名称格式,则应首先使用Where()
对其进行过滤。
然后,您需要将字符串的第一部分解析为int
并使用OrderBy()
按int
对列表进行排序:
var orderedAndFilteredFileList = ListaFiles
.Where(s => Regex.IsMatch(Path.GetFileName(s), @"^\d+_"))
.OrderBy(s => Convert.ToInt32(Path.GetFileName(s).Split('_')[0])).ToList();
这使用正则表达式来检查文件名是否具有所需的格式并过滤掉所有其他文件。然后通过从完整路径获取文件名来对序列进行排序(使用Path.GetFileName()
),在_
处拆分该名称,并将第一部分解析为最终用作排序的int
标准。
最终的ToList()
来电将IEnumerable<string>
返回的OrderBy()
再次转换为List<string>
。
答案 1 :(得分:0)
如果您想按照文件名的第一个数字对输入的列表进行排序,则需要拆分字符串,然后订购,即
。private List<string> OrderList(List<string> ListaFiles)
{
return ListaFiles.Select(f => Convert.ToInt32(Path.GetFileNameWithoutExtension(f.Split('_').First())))
.OrderBy(f => f);
.ToList();
}
虽然如果字符串为空,此代码将抛出异常,但拆分不返回任何内容,或者拆分后的第一个字符串不是整数格式。
根据您对其他答案的评论,您需要最后的完整路径,因此您需要删除select语句,以便您的方法变为:
private List<string> OrderList(List<string> ListaFiles)
{
return ListaFiles.OrderBy(f => Convert.ToInt32(Path.GetFileNameWithoutExtension(f.Split('_').First())))
.ToList();
}
答案 2 :(得分:0)
你可以这样做。
ListaFiles.OrderBy(x=>
{
var version = Path.GetFileNameWithoutExtension(x).Split('_')[0];
return int.Parse(version);
});