我有一个具有以下结构的对象:
public class StockData
{
public string Name { get; set; }
public double Change { get; set; }
public DateTime LastUpdate { get; set; }
public WorkflowStatus Status { get; set; }
}
工作流状态枚举定义如下:
public enum WorkflowStatus
{
PendingCoverage,
PendingCompliance,
Approved,
Rejected
}
问题: 我有一个网格(wpf)将所有StockData绑定到它,我在Status字段上设置了一个分组。我希望这些组出现在网格中,因为它是按WorkflowStatus枚举的顺序定义的。这非常正常,数据按顺序分组,因为它在枚举中定义,即第一组是Pendingcoverage,最后一组是拒绝。
现在我想删除这个枚举并引入一个对象图而不是枚举...这意味着将有一个名为WorkflowStatus的基类和一个名为PendingCoverage,PendingCompliance,Approved和Rejected的4个派生类。每个派生类都将覆盖ToString属性并返回适当的字符串。
现在,这不起作用。由于某种原因,它无法确定哪个组应该首先出现,哪个组应该随后出现。问题是如何在这种情况下实现IComparable。我应该在StockData或每个单独的WorkflowStatus对象上实现IComparable(或其他),是的,那么如何?另外,为什么这对于枚举而不是对象的情况有用呢?
答案 0 :(得分:0)
创建基类并为其添加一个所有子类必须实现的abstract Order
属性。基本上是一个整数,指定它们的顺序。
您还可以在抽象类上实现IComparable,以便基于其order属性比较对象。
public abstract class WorkStatus : IComparable<WorkStatus> {
public abstract int Order { get; }
public int CompareTo(WorkStatus w)
{
if(w.Order < this.Order)
return 1;
if(w.Order > this.Order)
return -1;
return 0;
}
}
对于每个实现,请为它们提供不同的Order值。
public class FirstStatus : WorkStatus {
public override int Order {get { return 1; } }
}
public class SecondStatus : WorkStatus {
public override int Order { get { return 2; } }
}
假设你的WPF网格只是应用标准的OrderBy查询,那么if应该如下工作。
//LINQPAD SNIPPET
void Main()
{
List<WorkStatus> list = new List<WorkStatus>();
list.Add(new SecondStatus()); //out of order initially.
list.Add(new FirstStatus());
Console.WriteLine(list.OrderBy(x => x));
}
答案 1 :(得分:0)
我很困惑为什么这里需要IComparable。你有两个问题。一个是获取排序列表,另一个是获取相应的图表:
// Takes a work status and returns the appropriate graph.
static GenericBaseGraphClass GetGraph(WorkStatus input)
{
select(input.Status)
{
// Concrete derived classes go here.
}
}
// Test data.
var someWork = new List<WorkStatus>()
{
new SecondStatus(),
new FirstStatus()
};
// Sort it.
var sortedWork = someWork.Sort((x,y) => x.Status > y.Status);
// Get your object graphs.
var objectGraphs = sortedWork.Select(x => GetGraph(x.Status))