2016-06-08 167 views
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); // ?? 

回答

1

你爲什麼做這個如此硬

class ClassSample 
{ 
    int param1; 
    int param2; 
    public int Prod { get { return param1 * param1; } } 
    public int Sum { get { return param1 * param1; } } 
    public ClassSample(int par1, int par2) { 
    param1 = par1; 
    param2 = par2; 
    } 
} 

var sortedList = list2.OrderBy(x => x.Sum); 

var MinProd = (from x in list2 select x.Prod).Min(); 

你可以傳遞一個的IComparer到Sort

您可以在課堂上實現IComparable功能

您正試圖重塑框架已有的東西