1
我有相同類型的元素數列表,例如列表使用LINQ比較對象的列表
class ClassSample
{
int param1;
int param2;
public ClassSample(int par1, int par2) {
param1 = par1;
param2 = par2;
}
}
List<ClassSample> list1 = new List<ClassSample>();
List<ClassSample> list2 = new List<ClassSample>();
List<ClassSample> list3 = new List<ClassSample>();
list1.Add(new ClassSample(2, 3));
list1.Add(new ClassSample(4, 2));
list2.Add(new ClassSample(3, 4));
list2.Add(new ClassSample(4, 6));
list2.Add(new ClassSample(2, 2));
list2.Add(new ClassSample(5, 3));
list3.Add(new ClassSample(4, 2));
list3.Add(new ClassSample(7, 3));
list3.Add(new ClassSample(4, 4));
對於ClassSample類我想定義不同的功能來獲得具有類型對象的排名。例如
long GetRankByProduct(ClassSample obj) {
return obj.param1 * obj.param2;
}
long GetRankBySum(ClassSample obj) {
return obj.param1 + obj.param2;
}
等等。
我想通過使用不同的動態標準對3個列表進行排序,函數的形式是將ClassSample對象列表和ClassSample的排名函數作爲參數。
// pseudo-code
public long GetListRankByMax(List<ClassSample> csList, Function<ClassSample, long> rankFunct) {
long max = csList.Max(x => rankFunct(x));
return max;
}
public long GetListRankByMin(List<ClassSample> csList, Function<ClassSample, long> rankFunct) {
long min = csList.Min(x => rankFunct(x));
return min;
}
public long GetListRankBySum(List<ClassSample> csList, Function<ClassSample, long> rankFunct) {
long sum = 0;
foreach (var cs in csList)
sum += rankFunct(cs);
return sum;
}
如何將一個碼的樣子,其中3只列出了與不同的標準動態排序,通過動態傳遞函數爲「列表中的排名」,並把它作爲參數計算「元素排序」功能? (例如,使用「ByMax」函數對列表進行排序,並對每個列表元素應用「ByProduct」排序函數或任何其他組合)。
我實際上想通過使用不同的標準對3個列表(而不是列表元素)進行排序。舉例來說,如果ClassSample列表是一個容器類中:
class ContainerClassSample {
List<ClassSample> ClsList {get;set;}
}
List<ContainerClassSample> containerList = new List<ContainerClassSample>();
ContainerClassSample container1 = new ContainerClassSample { ClsList = list1 };
ContainerClassSample container2 = new ContainerClassSample { ClsList = list2 };
ContainerClassSample container3 = new ContainerClassSample { ClsList = list3 };
containerList.Add(container1);
containerList.Add(container2);
containerList.Add(container3);
我需要的是這樣的(我應該能夠動態地改變兩個功能):
// pseudo-code
var result = containerList.OrderBy(GetListRankByMax, GetRankByProduct); // ??