Сортировать Наблюдаемая Коллекция Альфа-Числовой - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть класс расширений, который преобразует коллекцию Observable в список и выполняет заказ.Эта логика работает, но она мне нужна для сортировки буквенно-цифровых символов.Например,

Вместо A1 A10 A2 A3 должен быть A1 A2 A3 A10.

Как лучше всего это сделать?

<code><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);
    }
}

1 Ответ

1 голос
/ 07 февраля 2012

Разобрать 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, которые соответствуют свойствам класса.Это может быть излишним, но имеет много преимуществ, таких как вставка новых элементов прямо в правильное положение.Вам вообще не придется явно сортировать коллекции.

...