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将每个元素投影到其排序键一次,然后比较这些键。对于 size 的集合n,将n访问属性,然后在这些属性值之间进行 O(n log n) 比较。

所以基本上,您应该OrderBy尽可能简单地编写代码 - 并相信它会相当有效。

于 2013-06-02T15:02:48.787 回答
2

您可以使用IComparer<T>界面:

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;
    }
}

在您的代码中:

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 回答