【问题标题】:Use linq to compare lists of objects使用 linq 比较对象列表
【发布时间】:2016-06-08 17:11:41
【问题描述】:

我有几个具有相同类型元素的列表,例如 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;
}

通过动态传递“列表排名”函数并将计算“元素排名”的函数作为参数传递给 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); // ??

【问题讨论】:

    标签: .net linq list sorting


    【解决方案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

    你想重新发明框架已经做的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多