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 是我的视图模型中表示我要排序的列的属性的属性名称。

似乎我仅有的两个排序选项是升序和降序。但是它对 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 回答