使用 属性 的 属性 排序列表<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
排序,我如何允许 SomeClass
按 Owner.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
我有一个模型:
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
排序,我如何允许 SomeClass
按 Owner.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