使用 属性 的 属性 排序列表<T>

Sort List<T> using the property of its property

我有一个模型:

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

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

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 属性 排序时,出现错误:

"At least one object must implement IComparable."

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

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

非常感谢任何帮助。

编辑:

@dasblinkenlight 的 启发了我。事实上,按 Owner 排序是错误的,它是 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;}
  . . . .
}

感谢大家的付出。

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

对人物进行一些更改 class:

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

你可以在这个 link 中找到一个好的样本。

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