1

x と y の値を持つクラス A のリストがあります。

class A
{
   public int X { get; set; }
   public int Y { get; set; }
}

私のリスト:

List<A> MyList = GetListOfA();

Aプロパティの値を計算してリストをソートしたい。たとえば、今日のドル レートは X で倍増します。OrderBy 式を使用する場合、メソッドは x*log(x) 回を計算します。

値と変数を含む内部クラスを作成する、変数と計算値のリストを含む匿名型リストを作成する、計算値のキーでソートされた辞書に追加するなど、いくつかの方法を見つけました。

クリーンでシンプルな構文でそれを行うための最良のアプローチは何ですか?

4

3 に答える 3

5

OrderBy 式を使用する場合、メソッドは x*log(x) 回計算されます。

いいえ、そうではありません。LINQ to Objects では、OrderBy各要素をその順序付けキーに 1 回射影し、それらのキーを比較します。size のコレクションの場合、プロパティへのアクセスnnあり、それらのプロパティ値の間で O(n log n) 回の比較が行われます。

したがって、基本的には、OrderByできる限り単純にコードを記述し、それが合理的に効率的であると信じてください。

于 2013-06-02T15:02:48.787 に答える
2

You can use IComparer<T> interface:

class A
{
    public int X { get; set; }
    public int Y { get; set; }
}

class AComparer : IComparer<A>
{
    public int Compare(A x, A y)
    {
        var fx = F(x);
        var fy = F(y);

        if (fx < fy) return -1;
        if (fx == fy) return 0;
        return 1;
    }

    double F(A a) // your calculation
    {
        return a.X * 1.2;
    }
}

And in your code:

var list = new List<A>();
// fill list
list = list.OrderBy(a => a, new AComparer()).ToList();
于 2013-06-02T17:40:43.593 に答える
0

itelf でリストを変更せず、不変として扱うことをお勧めします。

すべての操作が行われるこのリストのコピーを (ビューのように) 保持します。

すべてを新しいクラスにカプセル化します。

私はこのようにします。

于 2013-06-02T15:04:37.553 に答える