8

次の文字列があります。

「弦1」

「弦2」

「弦3」

「弦15」

「弦17」

文字列を上記のようにソートしたい。ただし、SortDescription を使用してリストを並べ替えると、次の出力が得られます。

「弦1」

「弦15」

「弦17」

「弦2」

「弦3」

これを達成するためのアルゴリズムがあることは理解していますが、SortDescription の組み込み機能を使用してこれを行う方法はありますか?

private void SortCol(string sortBy, ListSortDirection direction)
{
        ICollectionView dataView =
          CollectionViewSource.GetDefaultView(ListView.ItemsSource);

        dataView.SortDescriptions.Clear();

        SortDescription sd = new SortDescription(sortBy, direction);
        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();
}

sortby は、並べ替えたい列を表すビュー モデル内のプロパティのプロパティ名です。

私の並べ替えオプションは、昇順と降順の 2 つだけのようです。しかし、CollectionView を並べ替える方法は、文字列を並べ替える方法ではありません。これを解決する簡単な方法はありますか?

4

2 に答える 2

7

リンクのおかげでそれを理解しました:C#の自然な並べ替え順序

[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    public static extern int StrCmpLogicalW(string psz1, string psz2);
}

public sealed class NaturalStringComparer : IComparer<string>
{
    public int Compare(object a, object b)
    {
        var lhs = (MultiItem)a;
        var rhs = (MultiItem)b;
        //APPLY ALGORITHM LOGIC HERE
        return SafeNativeMethods.StrCmpLogicalW(lhs.SiteName, rhs.SiteName);
    }
}

上記のアルゴリズム比較子を使用する方法は次のとおりです。

    private void SortCol()
    {
        var dataView =
                      (ListCollectionView)CollectionViewSource.GetDefaultView(ListViewMultiSites.ItemsSource);
        dataView.CustomSort = new NaturalOrderComparer();
        dataView.Refresh();
    }
于 2013-03-11T23:18:47.310 に答える
2

Linqを使用できます

var list = new List<string>
{
   "String 1",
   "String 17",
   "String 2",
   "String 15",
   "String 3gg"
};

var sort = list.OrderBy(s => int.Parse(new string(s.SkipWhile(c => !char.IsNumber(c)).TakeWhile(c => char.IsNumber(c)).ToArray())));

戻り値:

   "String 1",
   "String 2",
   "String 3gg"
   "String 15",
   "String 17",
于 2013-03-12T00:45:58.640 に答える