簡體   English   中英

排序可觀察的集合字母數字

[英]Sort Observable Collection Alpha-Numeric

我有一個擴展類,它將一個Observable集合轉換為列表並執行排序。 此邏輯有效,但我也需要對字母數字進行排序。 例如

代替A1 A10 A2 A3應該是A1 A2 A3 A10。

最好的方法是什么?

<pre>

public static void Sort<T>(this ObservableCollection<T> collection, Comparison<T> comparison)
    {
        var comparer = new Comparer<T>(comparison);

        List<T> sorted = collection.OrderBy(x => x, comparer).ToList();

        for (int i = 0; i < sorted.Count(); i++)
            collection.Move(collection.IndexOf(sorted[i]), i);
    }


    internal class Comparer<T> : IComparer<T>
{
    private readonly Comparison<T> comparison;

    public Comparer(Comparison<T> comparison)
    {
        this.comparison = comparison;
    }
    #region IComparer<T> Members

    public int Compare(T x, T y)
    {   
        return comparison.Invoke(x, y);
    }
}

</pre>

string解析為兩部分,字母部分和數字部分。 將數字部分放入int ,然后僅在alpha部分為平局時比較int部分。

public int Compare(string left, string right) {
  string leftAlpha;
  int leftNum;
  string rightAlpha;
  int rightNum;

  GetParts(left, out leftAlpha, out leftNum);
  GetParts(right, out rightAlpha, out rightNum);

  if (leftAlpha != rightAlpha) {
     return String.Compare(leftAlpha, rightAlpha);
  }
  else {
     return leftNum.CompareTo(rightNum);
  }
}

private void GetParts(string str, out string alpha, out string num) {
  alpha = str.Substring(0, 1);
  string numStr = str.Substring(1);
  num = Int32.Parse(numStr);
}

如果可以找到一種方法將這兩個部分作為類的屬性公開,則最好使用CollectionView進行綁定。 其中SourceCollection是您的ObservableCollection ,然后添加與該類的屬性相對應的SortDescriptions 這可能是過大了,但是確實有很多好處,例如將新元素直接插入正確的位置。 您根本不需要對集合進行任何排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM