2016-04-29 73 views
0

也許這已被回答,但我無法在Google上找到。如果這是我的道歉。我有一個SortedObservableCollection<TargetViewModel>,我試圖從字母順序中獲取基於TargetViewModel上的字符串屬性的字母順序。我在TargetViewModel上實現了CompareTo,問題是有一個特殊的常量選項卡,其字符串屬性只是我們用來添加新選項卡的一種+符號。這需要放在所有選項卡的右側,並在+符號之前添加任何新選項卡,以及在始終位於最左邊位置的常量選項卡之後。有沒有一種方法可以指定製表符,即在左側和右側,並將所有制表符排列在兩者之間?即| MainTab | Tab A | Tab B |選項卡C | + |C#SortedObservableCollection通過對象的字符串屬性

這裏就是我的CompareTo函數看起來像:

public int CompareTo(object obj) 
{ 
    if (obj == null) 
     return 1; 
    TargetViewModel tvm = obj as TargetViewModel; 
    if (tvm != null) 
    { 
     return string.Compare(tvm.Header, Header, StringComparison.CurrentCultureIgnoreCase); 
    } 

    throw new ArgumentException("Object is not a TargetViewModel"); 
} 
+0

從你的文章中,似乎沒有邏輯上的理由讓TargetViewModel有排序;看來分類純粹是爲了觀點。如果是這樣的話,也許你應該看看在視圖上使用「CollectionViewSource」(以及自定義分類器),而不是使用'SortedObservableCollection'。 –

回答

2

下面顯示瞭如何建立一個比較器,做基於字符串你想要什麼。它應該很容易適用於你的情況:

static void Main(string[] args) 
    { 
     List<string> items = new List<string> {"+", "A", "B", "V", "MainTab"}; 
     items.Sort(new CustomComparer()); 
     items.ForEach(Console.WriteLine); 
    } 

    class CustomComparer : IComparer<string> 
    { 
     public int Compare(string x, string y) 
     { 
      if (ReferenceEquals(x, y)) return 0; 
      if (x == null) return -1; 
      if (y == null) return 1; 
      if (x.Equals(y, StringComparison.Ordinal)) return 0; 

      if (x.Equals("MainTab", StringComparison.Ordinal)) return -1; 
      if (y.Equals("MainTab", StringComparison.Ordinal)) return 1; 

      if (x.Equals("+", StringComparison.Ordinal)) return 1; 
      if (y.Equals("+", StringComparison.Ordinal)) return -1; 

      return string.CompareOrdinal(x, y); 
     } 
    } 
+0

這工作完美,我只需交換回報! – CGideon