使用其属性的属性对List <t>进行排序

时间:2017-10-18 13:47:26

标签: c# sorting icomparable

我有一个模特:

public class SomeClass {
  public List<Person> Owner {get; set;}
  public int Balance {get;set;}
  . . . .
}

public class Person {
  public string Name {get;set;}
  public Guid PersonID {get;set;}
  . . . .
}

我有一个处理排序的包装类:

public class SortedResult <ModelType>: Result where ModelType: new() {

  . . . .

  private void SetProperties(IQueryable <ModelType> data, int pageIndex, int pageSize, string orderBy, OrderDirection ? orderDir) {
    if (!String.IsNullOrEmpty(orderBy)) {
      // auto-handles the order-by
      if (orderDir == OrderDirection.Descending) {
        data = data.OrderByDescending(orderBy);
      } else {
        data = data.OrderBy(orderBy);
      }
    }

    int total = data.Count();
    // no ordering
    Data = data.Skip(pageIndex * pageSize).Take(pageSize).ToList();
    AllData = myIncludeAllData ? data : null;
    PageIndex = pageIndex;
    PageSize = pageSize;
    TotalSize = total;
  }

}

如您所见,SortedResult允许我动态地对任何List<T>进行排序。使用SomeClass的其他属性进行排序运行正常但是当我按Owner属性排序时,我收到错误:

  

“至少有一个对象必须实现IComparable。”

我猜这是因为系统不知道如何通过List<SomeClass>属性对Owner进行排序。

如果使用SomeClassOwner.Name进行排序,我如何允许OwnerCompare排序?我见过的例子覆盖了模型的Owner逻辑,但我不知道从哪里开始。

非常感谢任何帮助。

修改

@dasblinkenlight的comment启发了我。实际上,按List<Person> SomeClass进行排序是错误的。

对于此修复,我修改了我的public class SomeClass { public List<Person> Owner {get; set;} //should sort using this prop instead of Owner public string OwnerName { get { return string.Join(", ", this.Owner.Select(r => r.Name)); } } public int Balance {get;set;} . . . . } 模型:

{{1}}

感谢所有人的努力。

2 个答案:

答案 0 :(得分:1)

对Person类进行一些更改:

public class Person : IComparable {
  public string Name {get;set;}
  public Guid PersonID {get;set;}
  // implement the methods for IComparable
}

您可以在此链接中找到一个好的样本。

https://msdn.microsoft.com/en-us/library/system.icomparable(v=vs.110).aspx

答案 1 :(得分:0)

Person应该实现IComparable<T>接口。查看官方docs以获取示例。