我有一个具有以下结构的对象:
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绑定到它,并且在状态字段上设置了一个分组。我希望这些组出现在网格中,因为它是按WorkflowStatus枚举顺序定义的。这非常好,数据按顺序分组,因为它是在enum中定义的,即第一组是Pendingcoverage,最后一组是拒绝的。
现在,我想删除这个枚举,引入一个对象图而不是enum..which,这意味着将有一个名为WorkflowStatus的基类和4个名为PendingCoverage、PendingCompliance的派生类,已批准和拒绝。每个派生类都将覆盖ToString属性并返回一个适当的字符串。
现在,这不管用。由于某些原因,它无法确定哪个组应该优先,哪个组应该随后。问题是我将如何在这个场景中实现IComparable。我应该在StockData或每个单独的WorkflowStatus对象上实现StockData(或其他东西)吗?是的,然后如何实现?此外,为什么这在枚举的情况下起作用,而在对象的情况下却不起作用?
发布于 2013-09-19 13:11:55
创建基类并向其添加一个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;
}
}对于每个实现,给它们一个不同的订单值。
public class FirstStatus : WorkStatus {
public override int Order {get { return 1; } }
}
public class SecondStatus : WorkStatus {
public override int Order { get { return 2; } }
}假设您的WPF网格只是应用标准的OrderBy查询,那么如果应该按照以下方式工作的话。
//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));
}发布于 2013-09-19 14:39:54
我搞不懂为什么这里需要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))https://stackoverflow.com/questions/18895359
复制相似问题