63981


たとえば、以下のUserクラスと

[code]

    public class User
    {
        public int Id1 { get; set; }
        public int Id2 { get; set; }
    }
    
[/code]

Id1の昇順でIEnumerable<User>を返すGetUsersメソッドがあったとします。  
この時に、すでにId1によるソートが行われていることを利用してC#側でThenByのみを行うことはできますか？

[code]

    // こんな感じのことがやりたい
    //var users = GetUsers().ThenBy(x => x.Id2);
    
    // これでも欲しい順序が得られるが、Id1によるソートが再度行われる
    // 件数が非常に大きいため、C#側でOrderByするとメモリが足りない
    var users = GetUsers().OrderBy(x => x.Id1).ThenBy(x => x.Id2);
    
[/code]

もちろん自分でそういったものを作ることは可能ですが、できればすでにあるものを使いたいため質問させていただきました。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-03-19T12:30:36.267
63979
2020-03-19T14:01:08.030
21330
question
c#
特定のキーによってソート済みであることが保証されているIEnumerable<T>に対してThenByしたい


無理です。

`OrderBy()`は正確にはソートを行うメソッドではありません。「enumerableされた際にソートされた結果を返す」オブジェクトを返すメソッドです。  
そして、`ThenBy()`は`OrderBy()`の返すオブジェクトに対してソートルールを追加するだけの存在です。`ThenBy()`を何段連ねてもソートルールが更新されるだけであり、実際のソート処理はenumerableされた時です。

そのためソート済みの結果に対しては無力です。


CC BY-SA 4.0
2020-03-19T14:01:08.030
63981
2020-03-19T14:01:08.030
4236
63979
answer