C# 统计及;不可比

C# 统计及;不可比,c#,asp.net,wpf,asp.net-3.5,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 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的基类和4个名为PendingCoverage、PendingCompliance、Approved和Rejected的派生类。每个派生类将覆盖ToString属性并返回适当的字符串


现在,这不起作用了。出于某种原因,它无法确定哪一组应该先来,哪一组应该随后来。问题是在这种情况下我将如何实现IComparable。我应该在StockData或每个单独的WorkflowStatus对象上实现IComparable(或其他)吗?是的,那么如何实现?还有,为什么这在enum中有效而在对象中无效?

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

还可以在抽象类上实现IComparable,以便if根据对象的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;
    }
}
假设您的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));


}
//LINQPAD代码段
void Main()
{
列表=新列表();
list.Add(new SecondStatus());//最初出现故障。
添加(新的FirstStatus());
Console.WriteLine(list.OrderBy(x=>x));
}

我不明白为什么这里需要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))
//获取工作状态并返回相应的图形。
静态GenericBaseGraphClass GetGraph(工作状态输入)
{
选择(输入状态)
{
//具体的派生类在这里。
}
}
//测试数据。
var someWork=新列表()
{
新的第二状态(),
新的第一状态()
};
//分类。
var sortedWork=someWork.Sort((x,y)=>x.Status>y.Status);
//获取对象图。
var objectGraphs=sortedWork.Select(x=>GetGraph(x.Status))

您所说的“无法确定哪一组先到,哪一组后到”是什么意思?那句话中的“it”是什么?另外,
enum
系统有什么问题,或者换句话说,使用单独的类有什么好处?“It”代表wpf网格和网格分组逻辑。迁移到单独类中的原因是要在各自的类中处理状态管理。
// 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))