0

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

 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        
    }

问题:我有一个将所有 StockData 绑定到它的网格 (wpf),并且我在状态字段上设置了一个分组。我希望这些组出现在网格中,因为它是按照 WorkflowStatus 枚举的顺序定义的。这工作得很好,数据按照枚举中定义的顺序分组,即第一组是 Pendingcoverage,最后一组是 Rejected。

现在我想删除这个枚举并引入一个对象图而不是枚举。这意味着将有一个名为 WorkflowStatus 的基类和 4 个名为 PendingCoverage、PendingCompliance、Approved 和 Rejected 的派生类。每个派生类都将覆盖 ToString 属性并返回适当的字符串。

现在,这行不通。由于某种原因,它无法确定哪个组应该先来,哪个组应该随后来。问题是我将如何在这种情况下实现 IComparable。我应该在 StockData 或每个单独的 WorkflowStatus 对象上实现 IComparable (或其他东西),是的,然后如何?另外,为什么这在枚举的情况下有效,而不是在对象的情况下?

4

2 回答 2

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));


}
于 2013-09-19T13:11:55.647 回答
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))
于 2013-09-19T14:39:54.770 回答