按计算值排序列表
本文关键字:列表 排序 计算 | 更新日期: 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();
我建议,不要更改列表本身,将其视为不可变的。
保存该列表的副本(如视图),所有操作都在其中进行。
封装在一个新类中。
我会这样做