2015-12-16 70 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

你可以给一个例子测试用例引发这个异常吗? –

+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 Georgiu评论中,SortedSetMin property应该利用你的自定义比较。但是,您目前可能使用的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 –

相关问题