排序可观测集合字母数字

本文关键字:数字 集合 可观 排序 | 更新日期: 2023-09-27 18:23:44

我有一个扩展类,它将Observable集合转换为list并执行排序依据。这个逻辑可以工作,但我也需要它来对字母数字进行排序。例如

代替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中,然后仅当阿尔法部分为平局时比较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。这可能有些过头了,但确实有很多好处,比如将新元素直接插入正确的位置。您根本不需要显式地对集合进行任何排序。