2012-02-07 5 views
0

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

Вместо 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> 
+0

так, чтобы быть явным, вы запрашиваете реализацию сравнения , которая сравнивается буквенно-цифровым способом? –

+0

Правильно, мне нужно, чтобы сравнить буквенно-цифровые символы вместо строкового литерала. –

+0

Любые причины не использовать [сортировка, указанная здесь] (http://www.dotnetperls.com/alphanumeric-sorting)? –

ответ

1

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

Смежные вопросы