C# 如何使用字段名的子部分按表达式指定双顺序

C# 如何使用字段名的子部分按表达式指定双顺序,c#,linq,lambda,C#,Linq,Lambda,对于lamabda/linq来说,这是一个相当新的东西 我有一个目录,里面有很多文件 我想根据文件名的子部分对所有这些文件进行分组和排序 例如,我有以下文件: group1.01,001.dat group1.01.102.dat group1.01.086.dat group2.03,101.dat group2.02.002.dat group2.01.016.dat 我想要这样的结果: group1.01,001.dat group1.01.086.dat group1.01.102.

对于lamabda/linq来说,这是一个相当新的东西

我有一个目录,里面有很多文件

我想根据文件名的子部分对所有这些文件进行分组和排序

例如,我有以下文件:

group1.01,001.dat
group1.01.102.dat
group1.01.086.dat

group2.03,101.dat
group2.02.002.dat
group2.01.016.dat
我想要这样的结果:

group1.01,001.dat
group1.01.086.dat
group1.01.102.dat

现在,我已经成功地将我的文件分组好了,只是没有按照它们的顺序

注:顺序由ss和fff按顺序定义,其中文件格式为:

groupname.ss.fff.dat

因此,要获取组,我有以下代码:

var result = Directory.EnumerateFiles(min, "*.dat")
.Select(s => Path.GetFileNameWithoutExtension(s))
.GroupBy(s => (s.Split('.'))[0]).ToList();
这很好用。我想通过添加以下内容,我就可以完成这项工作:

var result = Directory.EnumerateFiles(min, "*.dat")
.Select(s => Path.GetFileNameWithoutExtension(s))
.GroupBy(s => (s.Split('.'))[0])
.OrderBy(s=> (s.Split('.'))[1] && s.Split('.'))[2]).ToList();

它不编译。我需要做什么?要指定二级排序标准,请使用:


这段代码稍有不同,它只调用一次
name.Split('.')
,并在最终分组之前进行所有排序。

作为旁注:在这里使用LINQ语法可能更容易(而不仅仅是底层扩展方法);编译器语法使多个顺序条件变得简单。@MarcGravell您好,谢谢您的发布。我是新来的。你能提供一个样品吗?谢谢,成功了。非常感谢你。这对我很有教育意义!我已将此作为我最喜欢的答案之一加入书签。再次感谢!
var result = Directory.EnumerateFiles(min, "*.dat")
.Select(s => Path.GetFileNameWithoutExtension(s))
.GroupBy(s => (s.Split('.'))[0])
.OrderBy(s=> (s.Split('.'))[1] && s.Split('.'))[2]).ToList();
var result = Directory.EnumerateFiles(min, "*.dat")
    .Select(fileName => Path.GetFileNameWithoutExtension(fileName))
    .OrderBy(name => name.Split('.')[1])
    .ThenBy(name => name.Split('.')[2])
    .GroupBy(name => name.Split('.')[0])
    .OrderBy(g => g.Key) // Note: g is an IGrouping<string, string>
    .ToList();
var result =
    from fileName in Directory.EnumerateFiles(min, "*.dat")
    let name = Path.GetFileNameWithoutExtension(fileName)
    let parts = name.Split('.')
    orderby parts[0], parts[1], parts[2]
    group name by parts[0] into g
    select g;