按计算值排序列表

本文关键字:列表 排序 计算 | 更新日期: 2023-09-27 18:16:23

我有一个类a的x和y值列表:

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

我的列表:

List<A> MyList = GetListOfA();

我想按A属性的计算值对列表进行排序。比如今天美元汇率乘以X。如果我将使用orderderby表达式,该方法将计算x*log(x)次。

我找到了一些方法来做到这一点,如创建包含值和变量的内部类,匿名类型列表,将包括变量和计算值的列表,将其添加到按计算值的键排序的字典等。

用干净和简单的语法做这件事的最好方法是什么?

按计算值排序列表

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

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

因此,基本上,您应该使用OrderBy来编写尽可能简单的代码-并相信它将是相当有效的。

可以使用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();

我建议,不要更改列表本身,将其视为不可变的。

保存该列表的副本(如视图),所有操作都在其中进行。

封装在一个新类中。

我会这样做