LINQ分组和排序不';I don’我没有按预期工作

LINQ分组和排序不';I don’我没有按预期工作,linq,Linq,我的预期产出是: 扩展名:.txt--CATS.txt--DOGS.txt扩展名:.pdf-- INFO.PDF--TEST2.PDF扩展名:.doc--SUMMARY.doc-- TEST1.DOC 下面是函数 public void TestGroupByFluentSyntax() { string[] files = new string[] { "test1.doc", "test2.pdf", "cats.txt", "dogs.txt", "info

我的预期产出是:

扩展名:.txt--CATS.txt--DOGS.txt扩展名:.pdf-- INFO.PDF--TEST2.PDF扩展名:.doc--SUMMARY.doc-- TEST1.DOC

下面是函数

    public void TestGroupByFluentSyntax()
    {
        string[] files = new string[] { "test1.doc", "test2.pdf", "cats.txt", "dogs.txt", "info.pdf", "summary.doc" };

        IEnumerable<IGrouping<string, string>> query = files.GroupBy(file => System.IO.Path.GetExtension(file), file => file.ToUpper())
                                                            .OrderBy(grouping => grouping.Key);

        foreach(IGrouping<string, string> grouping in query)
        {
            Console.WriteLine("Extension: " + grouping.Key);
            foreach (string fileName in grouping)
                Console.WriteLine("   -- " + fileName);
        }
    }

    public void TestGroupByFluentSyntax2()
    {
        string[] files = new string[] { "test1.doc", "test2.pdf", "cats.txt", "dogs.txt", "info.pdf", "summary.doc" };

        IEnumerable<IGrouping<string, string>> query = files.OrderBy(file => file).GroupBy(file => System.IO.Path.GetExtension(file), file => file.ToUpper());

        foreach (IGrouping<string, string> grouping in query)
        {
            Console.WriteLine("Extension: " + grouping.Key);
            foreach (string fileName in grouping)
                Console.WriteLine("   -- " + fileName);
        }
    }
public void TestGroupByFluentSyntax()
{
string[]files=新字符串[]{“test1.doc”、“test2.pdf”、“cats.txt”、“dogs.txt”、“info.pdf”、“summary.doc”};
IEnumerable query=files.GroupBy(文件=>System.IO.Path.GetExtension(文件),文件=>file.ToUpper())
.OrderBy(grouping=>grouping.Key);
foreach(查询中的i分组)
{
Console.WriteLine(“扩展名:“+grouping.Key”);
foreach(分组中的字符串文件名)
Console.WriteLine(“--”+文件名);
}
}
public void TestGroupByFluentSyntax2()
{
string[]files=新字符串[]{“test1.doc”、“test2.pdf”、“cats.txt”、“dogs.txt”、“info.pdf”、“summary.doc”};
IEnumerable query=files.OrderBy(file=>file.GroupBy(file=>System.IO.Path.GetExtension(file),file=>file.ToUpper());
foreach(查询中的i分组)
{
Console.WriteLine(“扩展名:“+grouping.Key”);
foreach(分组中的字符串文件名)
Console.WriteLine(“--”+文件名);
}
}

如果我先下单,然后分组,它就可以工作了。但分组和排序并不是这样。我在函数“TestGroupByFluentSyntax()”中缺少了什么?我在该函数中分组,然后排序?

您并不遥远。在
TestGroupByFluentSyntax()
中,您的输出是:

Extension: .doc
   -- TEST1.DOC
   -- SUMMARY.DOC
Extension: .pdf
   -- TEST2.PDF
   -- INFO.PDF
Extension: .txt
   -- CATS.TXT
   -- DOGS.TXT
您可以按扩展名分组,并在扩展名上排序。因此,当您显示时,扩展名来自doc、pdf和txt。但每组中的文件未排序。您可以实现所需的输出(通过颠倒扩展顺序-使用
OrderByDescending
如下所示:

IEnumerable<IGrouping<string, string>> query 
    = files.GroupBy(file => System.IO.Path.GetExtension(file), file => file.ToUpper())
                   .OrderByDescending(grouping => grouping.Key);
以下是输出:

Extension: .txt
   -- CATS.TXT
   -- DOGS.TXT
Extension: .pdf
   -- INFO.PDF
   -- TEST2.PDF
Extension: .doc
   -- SUMMARY.DOC
   -- TEST1.DOC
这起作用了:
public void TestGroupByFluentSyntax()
{
WriteLine(“TestGroupByFluentSyntax”);
string[]files=新字符串[]{“test1.doc”、“test2.pdf”、“cats.txt”、“dogs.txt”、“info.pdf”、“summary.doc”};
IEnumerable query=files.GroupBy(file=>System.IO.Path.GetExtension(file),file=>file.ToUpper());
foreach(查询中的i分组)
{
Console.WriteLine(“扩展名:“+grouping.Key”);
foreach(grouping.OrderBy(name=>name)中的字符串文件名)
Console.WriteLine(“--”+文件名);
}
}

好的,我想我意识到了我的错误。OrderBy只是按键对组进行排序,而不是按组的成员进行排序。我想我真正的问题是,如果我通过GroupBy进行平面到层次(字符串到iGroup)的转换,你能保持层次结构(iGroup)吗,以有效的方式对单个组进行排序?我发现GroupBy会按键以升序对组进行隐式排序。添加第一个OrderBy是多余的。您不应该依赖于按
GroupBy
排序,除非您的源排序已经是您想要的。
Extension: .txt
   -- CATS.TXT
   -- DOGS.TXT
Extension: .pdf
   -- INFO.PDF
   -- TEST2.PDF
Extension: .doc
   -- SUMMARY.DOC
   -- TEST1.DOC
    This worked:

    public void TestGroupByFluentSyntax()
    {
        Console.WriteLine("TestGroupByFluentSyntax");

        string[] files = new string[] { "test1.doc", "test2.pdf", "cats.txt", "dogs.txt", "info.pdf", "summary.doc" };

        IEnumerable<IGrouping<string, string>> query = files.GroupBy(file => System.IO.Path.GetExtension(file), file => file.ToUpper());

        foreach (IGrouping<string, string> grouping in query)
        {
            Console.WriteLine("Extension: " + grouping.Key);

            foreach (string fileName in grouping.OrderBy(name => name))
                Console.WriteLine("   -- " + fileName);
        }
    }