枚举& IComparable的

时间:2013-09-19 13:01:44

标签: c# asp.net wpf asp.net-3.5

我有一个具有以下结构的对象:

 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(或其他),是的,那么如何?另外,为什么这对于枚举而不是对象的情况有用呢?

2 个答案:

答案 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))