我有一个包含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列表将包含变量和计算值的列表,以按计算值的键将其添加到排序字典中等
使用干净简单的语法来实现它的最佳方法是什么?
答案 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)
我建议您不要自行更改列表,将其视为不可变。
保留此列表的副本(如视图),其中包含所有操作。
将所有内容封装在一个新类中。
我会这样做。