2012-02-07 13 views
0

私はObservableコレクションをリスト表示し、注文を実行する拡張クラスを持っています。このロジックは動作していますが、アルファ数値もソートする必要があります。例えば。並べ替え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> 
+0

明示的に言えば、英数字で比較する比較の実装を求めるのですか? –

+0

正しいですが、文字列リテラルの代わりに英数字を比較する必要があります。 –

+0

[ここで説明した並べ替え](http://www.dotnetperls.com/alphanumeric-sorting)を使用しない理由は何ですか? –

答えて

1

stringをアルファ部分と数字部分の2つの部分に分解します。数字部分を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を使用してオフ最善かもしれません。 SourceCollectionObservableCollectionであり、クラスのプロパティに対応するSortDescriptionsを追加します。それは過度なことかもしれませんが、新しい要素を正しい位置に直接挿入するなど、多くの利点があります。コレクションを明示的にソートする必要はありません。

関連する問題