Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ orderby关键字与orderby扩展方法的等效排序_C#_Sorting_Linq To Objects_.net 3.5 - Fatal编程技术网

C# 使用LINQ orderby关键字与orderby扩展方法的等效排序

C# 使用LINQ orderby关键字与orderby扩展方法的等效排序,c#,sorting,linq-to-objects,.net-3.5,C#,Sorting,Linq To Objects,.net 3.5,我试图找到一组链接的OrderBy/然后是by扩展方法调用,它相当于使用OrderBy关键字的LINQ语句 我使用orderby关键字的LINQ语句如下所示: List<Summary> sortedSummaries = new List<Summary>( from summary in unsortedSummaries orderby summary.FieldA ascending, summary.FieldB asce

我试图找到一组链接的
OrderBy
/
然后是by
扩展方法调用,它相当于使用
OrderBy
关键字的LINQ语句

我使用
orderby
关键字的LINQ语句如下所示:

List<Summary> sortedSummaries = new List<Summary>(
    from summary in unsortedSummaries
    orderby summary.FieldA ascending,
            summary.FieldB ascending,
            summary.FieldC ascending,
            summary.FieldD ascending
    select summary);
List<Summary> sortedSummaries = new List<Summary>(unsortedSummaries);    
sortedSummaries.OrderBy(x => x.FieldA).ThenBy(x => x.FieldB).ThenBy(x => x.FieldC).ThenBy(x => x.FieldD);
但是,与使用
orderby
关键字使用LINQ语句相比,这给出了完全不同的结果

我可能做错了什么


我试图转换为使用chained
OrderBy
/
ThenBy
扩展方法调用的原因是我需要在
FieldD
上使用自定义比较器,如下所示:

.ThenBy(x => x.FieldD, new NaturalSortComparer())
我不知道如何使用带有
orderby
关键字的LINQ语句,所以我认为使用扩展方法可能会让我走得更远,但由于我无法让扩展方法版本提供与
orderby
关键字版本相同的结果,我现在回到绘图板上


有什么想法吗?

您的点表示法调用没有将结果分配给任何内容。它应该是:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                       .ThenBy(x => x.FieldB)
                                       .ThenBy(x => x.FieldC)
                                       .ThenBy(x => x.FieldD);
不要忘记LINQ操作符永远不会更改现有序列-它们返回具有适当差异的新序列(在本例中为排序)。如果要就地排序,请使用
List.sort

上面的查询正是原始代码的LINQ部分所做的。但是,如果我想从中构造一个列表,我不会将它传递给
list
构造函数-我会使用
ToList
扩展方法:

var sortedSummaries = unsortedSummaries.OrderBy(x => x.FieldA)
                                       .ThenBy(x => x.FieldB)
                                       .ThenBy(x => x.FieldC)
                                       .ThenBy(x => x.FieldD)
                                       .ToList();

检查它是否符合您的预期(它确实应该符合您的预期),然后您可以进行自定义比较。

啊,是的,就是这样。现在完全有道理了。我以为我是在考虑LINQ操作符从未改变现有序列,但我一定是搞混了:)