使用linq比较对象列表

时间:2016-06-08 17:11:42

标签: .net linq list sorting

我有几个包含相同类型元素的列表,例如List

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;
}

如何通过动态传递&#34;列表排名&#34;的功能,如何使用不同的标准动态地对3个列表进行排序。并将其作为参数给出计算&#34;元素排名&#34;的函数。 ? (例如,使用&#34; ByMax&#34;函数对列表进行排序,并通过向每个列表元素应用&#34; ByProduct&#34;排名函数,或其他任何组合。)

我实际上想要使用不同的标准对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 个答案:

答案 0 :(得分: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

你正在努力重塑框架已经完成的东西