如何在linq中订购组结果

时间:2014-08-28 10:27:52

标签: c# linq group-by sql-order-by

我有一个文件列表说 prg_3.txt,prg_2.txt,prg_1.txt。

我需要遍历文件并按顺序1,2,3合并文件。

我使用的查询如下:

var Groups = shortfilenames.GroupBy(s => s.Substring(0, s.IndexOf('_'))).ToList();

上面的查询会创建一个组名prg,它将有3个文件。

现在,我需要按照1,2,3的顺序对它们进行排序,即从它们的文件名开始。

在这里,我得到分组结果,但我不知道如何订购每组中的元素

请帮助..我知道任何问题..

已编辑:

它会不够好?

  var userGroups = shortfilenames.GroupBy(s => s.Substring(0, s.IndexOf('_'))).Select(g=>g.OrderBy(x=>x.Substring(x.IndexOf('_',x.Length-x.IndexOf('_')))));

3 个答案:

答案 0 :(得分:1)

这应该有效,但可能不会那么有效:

shortfilenames
    .GroupBy(s => s.Substring(0, s.IndexOf('_')))
    .Select(
        g => g.OrderBy(x => int.Parse(new String(x.Where(char.IsDigit).ToArray()))));

如果您的文件包含其他数字,这将不起作用,这是另一种解决方法,根据您的评论,这应该与您指定的格式一起使用:

 shortfilenames
      .GroupBy(s => s.Substring(0, s.IndexOf('_')))
      .Select(g => g.OrderBy(
          x =>
             {
                 var index = x.IndexOf('_');
                 return int.Parse(x.Substring(index + 1, x.LastIndexOf('.') - index));
             }));

答案 1 :(得分:0)

由于这些名称有点匹配,只需使用OrderBy并给它命名是什么问题?

var v = new string[] {"prg_3.txt","prg_2.txt", "prg_1.txt"};

var sorted = v.OrderBy(name => name); 

你得到:

prg_1.txt 
prg_2.txt 
prg_3.txt 

答案 2 :(得分:-1)

如果你想按文件名对内部分组进行排序,这应该可以解决问题:

shortfilenames.GroupBy(s => s.Substring(0, s.IndexOf('_'))).Select(g => g.OrderBy(e => e)).ToList();