按计算值排序列表

时间:2013-06-02 14:59:52

标签: c# .net sorting lambda

我有一个包含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)次。

我发现了一些方法,比如创建包含值和变量的内部类,Anonymous Type列表将包含变量和计算值的列表,以按计算值的键将其添加到排序字典中等

使用干净简单的语法来实现它的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

  

如果我将使用OrderBy表达式,该方法将计算x * log(x)次。

不,不会。在LINQ to Objects中,OrderBy将每个元素投射到其排序键一次,然后比较这些键。对于大小为n的集合,将对属性进行n次访问,然后对这些属性值进行O(n log n)比较。

所以基本上,你应该只使用OrderBy来尽可能简单地编写代码 - 并且相信它会合理有效。

答案 1 :(得分: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();

答案 2 :(得分:0)

我建议您不要自行更改列表,将其视为不可变。

保留此列表的副本(如视图),其中包含所有操作。

将所有内容封装在一个新类中。

我会这样做。