2012-02-11 144 views
1

我無法知道如何爲泛型類實現IComparable接口方法CompareTo實現通用類的Ipaparable接口

我有一個名爲BindingProperty<T>的類,它用於創建List<BindingProperty<intOrString>>以綁定到DataGrid。問題在於我無法執行排序操作,因爲IComparable接口未由此BindingProperty<T>類實現。比較的結果將取決於BindingProperty<T>類的數據成員'值',其中'值'是類型T.當我單擊DataGrid的列標題時,我得到一個例外CompareTo()方法未實現。

我需要幫助來實現這個接口。我應該使用IComparable<T>?如果是的話,我該怎麼做?

在此先感謝 沙克蒂

+0

什麼是泛型列表的類型? – twilson 2012-02-11 12:41:33

+0

IList已用於綁定DataGrid列。 – 2012-02-11 13:34:21

回答

0

建立一個泛型類型約束上T.

public class BindingProperty<T> : IComparable where T : IComparable 
{ 
    public T Value {get; set;} 

    public int CompareTo(object obj) 
    { 
     if (obj == null) return 1; 

     var other = obj as BindingProperty<T>; 
     if (other != null) 
      return Value.CompareTo(other.Value); 
     else 
      throw new ArgumentException("Object is not a BindingProperty<T>"); 
    } 
} 

編輯:
替代解決方案來處理,如果值不落實IComparable。這將支持所有類型,只是如果它們不執行IComparable就不會進行排序。

public class BindingProperty<T> : IComparable 
    { 
     public T Value {get; set;} 

     public int CompareTo(object obj) 
     { 
      if (obj == null) return 1; 

      var other = obj as BindingProperty<T>; 
      if (other != null) 
      { 
       var other2 = other as IComparable; 
       if(other2 != null) 
        return other2.CompareTo(Value); 
       else 
        return 1; //Does not implement IComparable, always return 1 
      } 
      else 
       throw new ArgumentException("Object is not a BindingProperty<T>"); 
     } 
    } 
+0

當我實現上述解決方案時,出現錯誤消息_「錯誤:類型'System.Windows.Media.Imaging.BitmapImage'不能用作泛型類型或方法'Bally.UI'中的類型參數'T'。 Framework.BindingProperty '。沒有從'System.Windows.Media.Imaging.BitmapImage'到'System.IComparable '_的隱式引用轉換。「這是來自項目的另一部分,BindingProperty被用作** BindingProperty **。是否有出路? – 2012-02-11 13:48:07

+1

泛型類型必須實現'IComparable'或者你不能對它進行排序'BitmapImage我不明白在圖像上排序 – Magnus 2012-02-11 13:50:52

+0

我理解實現IComparable是必不可少的,但代碼的另一部分(作爲現有框架的一部分)確實具有此BitmapImage作爲BindingProperty作爲類型 – 2012-02-13 17:30:44

0

如果類型是一個自定義類,那麼你的自定義類必須IComparable的。

例如

List<FooClass>,則FooClass需要繼承/執行IComparable

+0

謝謝。但是所有的類T都不能實現IComparable,因爲像BitmapImage,CustomCommands(實現UICommand並具有BindingProperty >成員)類是不兼容的。我不知道該怎麼做。 – 2012-02-11 13:50:36

0

您可以使用通用約束來要求T實現IComparable<T>。然後您可以比較兩個BindingProperty<T>實例,比較它們的Value成員。我不清楚您是否需要您的班級實施IComparableIComparable<T>,但實施這兩項工作並不多。

class BindingProperty<T> 
    : IComparable<BindingProperty<T>>, IComparable where T : IComparable<T> { 

    public T Value { get; set; } 

    public Int32 CompareTo(BindingProperty<T> other) { 
    return Value.CompareTo(other.Value); 
    } 

    public Int32 CompareTo(Object other) { 
    if (other == null) 
     return 1; 
    var otherBindingProperty = other as BindingProperty<T>; 
    if (otherBindingProperty == null) 
     throw new ArgumentException(); 
    return CompareTo(otherBindingProperty); 
    } 

} 
+0

當我實現上述解決方案時,出現錯誤消息_「錯誤:類型'System.Windows.Media.Imaging.BitmapImage'不能用作泛型類型或方法'Bally.UI'中的類型參數'T'。 Framework.BindingProperty '。不存在從'System.Windows.Media.Imaging.BitmapImage'到'System.IComparable '_的隱式引用轉換。這是來自項目的另一部分。 BindingProperty被用作** BindingProperty **。有出路嗎? – 2012-02-11 13:43:31