2015-12-16 3 views
0

в C# при использовании отсортированных структур набора данных и использования ICompare для сортировки набора по конкретной вставке значения или добавить работу эффективно, но при попытке получить значение мин в наборе вызывает исключение Моего кодКак минимум один объект должен реализовать IComparable. SortedSet C#

class priorityqueue 
{ 
    public SortedSet<NODE> opendList; 
    private class SortAccordingToTotal : IComparer<NODE> 
    { 
     public int Compare(NODE a, NODE b) 
     { 
      return a.TOTAL.CompareTo(b.TOTAL); 
     } 

    } 
    public priorityqueue() 
    { 
     opendList = new SortedSet<NODE>(new SortAccordingToTotal()); 
    } 
    public void Push (NODE N) 
    { 
     opendList.Add(N); 
    } 
    public bool search(NODE N) 
    { 
     return opendList.Contains(N); 
    } 
    public NODE POP() 
    { 
     NODE TEMP = new NODE(); 

     TEMP = opendList.Min(); 
     opendList.Remove(TEMP); 
     return TEMP; 
    } 

} 
+0

Можете ли вы привести пример testcase, где это исключение выбрано? –

+3

'Min' - это свойство, а не метод (https://msdn.microsoft.com/en-us/library/dd411719(v=vs.110).aspx), поэтому попробуйте изменить' opendList.Min() ' с 'opendList.Min', и он должен работать. –

+1

Не должно быть проблемы, так как Min() также является методом расширения на IEnumerable https://msdn.microsoft.com/library/dd411939%28v=vs.100%29.aspx –

ответ

2

Расширение на комментарии от @Claudiu Георьего, то Min property из SortedSet должен использовать свой собственный компаратор. Тем не менее, Min() extension method, который вы, скорее всего, используете в настоящее время, требует, чтобы ваш класс NODE реализовал интерфейс IComparable<T> или IComparable. Если вы переключитесь на вызов свойства, он должен работать.

1

Ваш вопрос довольно неоднозначный, но похоже, что вашему классу NODE необходимо реализовать интерфейс IComparable. К счастью, делать это легко.

public class NODE: IComparable 
{ 
    public int total{ get; set; } 
    public int CompareTo(object obj) 
    { 
     if (obj == null) return 1; 
     var otherNode = obj as Hobby; 
     return this.total.CompareTo(otherNode.total); 
    } 
} 
+1

Не нужно, так как он использует IComparer для своего SortedSet –

Смежные вопросы