2013-09-19 5 views
0

У меня есть объект, имеющий следующую структуру:Перечисление & IComparable

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. Это работает абсолютно нормально, и данные группируются в порядке, так как оно определено внутри перечисления. Первая группа - Pendingcoverage, а последняя - Отклонено.

Теперь я хочу удалить это перечисление и ввести граф объектов вместо enum..which означает, что будет базовый класс WorkflowStatus и 4 производный класс под названием PendingCoverage, PendingCompliance, Approved and Rejected. Каждый производный класс будет переопределять свойство ToString и возвращать соответствующую строку.

Теперь это не работает. По какой-то причине он не может установить, какая группа должна быть первой, и которая должна появиться впоследствии. Вопрос в том, как я буду реализовывать IComparable в этом сценарии. Должен ли я реализовать IComparable (или что-то еще) в StockData или на каждом отдельном объекте WorkflowStatus и да, то как? Также почему это работает в случае перечисления, а не в случае объекта?

+0

Что вы имеете в виду под "это не в состоянии определить, какая группа должна прийти первым и который должен прийти впоследствии? Что такое «это» в этом предложении? Кроме того, что было не так с системой enum или другим способом, какую выгоду вы получаете от использования отдельных классов? – Sheridan

+0

«Это» означает сетку wpf и логику группировки сетки. Причиной перехода в отдельный класс является управление состоянием в соответствующих классах. – Mike

ответ

0

Создайте свой базовый класс и добавьте к нему свойство abstract Order, которое должны реализовать все подклассы. В основном целое число, которое определяет их порядок.

Вы также можете реализовать IComparable в своем абстрактном классе, чтобы при сравнении объектов на основе их свойства порядка.

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


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