2011-06-23 57 views
0

我想排序自定义BindingList。但是我发现我的Comparer不能识别我的类的属性。 “x.Code_PK_OriginalValue”未被识别。奇怪的是,intellisense在Comparer类中将“Begrenzingen”标记为下面第一个代码块中的“Begrenzingen”。C#自定义比较器与比较委托

BindingListX<Begrenzingen> lst = new BindingListX<Begr.....; 

lst.OrderBy(t => t, new CustomComparer<Begrenzingen>()); 

public class CustomComparer<Begrenzingen> : IComparer<Begrenzingen> 
{ 
    private readonly Comparison<Begrenzingen> _comparison; 

    public CustomComparer() 
    { 
     _comparison = new Comparison<Begrenzingen>(
          (Begrenzingen x, Begrenzingen y) => 
          { 
           return x.Code_PK_OriginalValue.CompareTo(y.Code_PK_OriginalValue); 
          } 
        ); 
    } 

    public int Compare(Begrenzingen x, Begrenzingen y) 
    { 
     return _comparison(x, y); 
    } 
} 

public class BindingListX<T> : BindingList<T> 
{ 
    public void OrderBy(Func<T,T> keySelector, IComparer<T> comparer) 
    { 
     this.Items.OrderBy(keySelector, comparer); 
    } 
} 

public class Begrenzingen : DefaultTable, IComparable<Begrenzingen> 
{ 
    public Begrenzingen() 
    { //New -> Insert DB 
     Code_PK_OriginalValue = -1; 
     isDeleted = false; 
    } 

    public decimal Code_PK_OriginalValue { get; set; } 
    public decimal Code_PK { get; set; } 
    public string Naam { get; set; } 
    public decimal? SeqLayer { get; set; } 

    public Boolean isDeleted { get; set; } 

    public string SeqLayerDisplayValue { 
     get { 
      if (SeqLayer == null) return string.Empty; 
      return (from sdo in MainWindow.Main.SdoLayers where sdo.SeqLayer == this.SeqLayer select sdo.DisplayValue).First(); 
     } 
    } 


    public override string ToString() 
    { 
     return String.Format("{0};{1};{2};{3}", Code_PK_OriginalValue, Code_PK, Naam, SeqLayer); 
    } 

    public int CompareTo(Begrenzingen o) 
    { 
     return Code_PK.CompareTo(o.Code_PK); 
    } 
} 
+0

请问你的类是什么样子? –

+0

请参阅OP – Stinus

+0

中的编辑为什么使用额外的比较而不是实现'Compare'方法内部的逻辑? –

回答

1

如何只lst.OrderBy(t => t.Code_PK_OriginalValue);

+0

我将我的代码更改为 'public void OrderBy(Func keySelector) { this.Items.OrderBy(keySelector); }' 和'lst.OrderBy(t => t.Code_PK);'。 但是这并没有让我的列表排序。这些项目按原始顺序排列。 – Stinus

+2

'OrderBy'实际上不对列表排序,但返回一个已排序的'IEnumerable'用途:'lst = lst.OrderBy(t => t.Code_PK).ToList();' – Magnus