2016-06-08 140 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功能

您正试图重塑框架已有的东西