首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举& IComparable

枚举& IComparable
EN

Stack Overflow用户
提问于 2013-09-19 13:01:43
回答 2查看 3.8K关注 0票数 1

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

代码语言:javascript
复制
 public class StockData
    {
        public string Name { get; set; }
        public double Change { get; set; }
        public DateTime LastUpdate { get; set; }
        public WorkflowStatus Status { get; set; }       
    }

工作流状态枚举定义如下:

代码语言:javascript
复制
public enum WorkflowStatus
    {
        PendingCoverage,
        PendingCompliance,
        Approved,
        Rejected        
    }

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

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

现在,这不管用。由于某些原因,它无法确定哪个组应该优先,哪个组应该随后。问题是我将如何在这个场景中实现IComparable。我应该在StockData或每个单独的WorkflowStatus对象上实现StockData(或其他东西)吗?是的,然后如何实现?此外,为什么这在枚举的情况下起作用,而在对象的情况下却不起作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-19 13:11:55

创建基类并向其添加一个abstract Order属性,所有子类都必须实现该属性。基本上是一个整数,它指定它们的顺序。

您还可以在抽象类上实现IComparable,以便如果根据对象的order属性对对象进行比较。

代码语言:javascript
复制
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;
    }
}

对于每个实现,给它们一个不同的订单值。

代码语言:javascript
复制
public class FirstStatus : WorkStatus {
   public override int Order {get { return 1; } }
}

public class SecondStatus : WorkStatus {
   public override int Order { get { return 2; } }
}

假设您的WPF网格只是应用标准的OrderBy查询,那么如果应该按照以下方式工作的话。

代码语言:javascript
复制
//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));


}
票数 0
EN

Stack Overflow用户

发布于 2013-09-19 14:39:54

我搞不懂为什么这里需要IComparable。你有两个问题。一个是得到一个排序列表,另一个是得到适当的图:

代码语言:javascript
复制
// 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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18895359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档