SortDescription排序字​​符串的方式不同

时间:2013-03-11 22:23:35

标签: c# wpf sorting gridview

我有以下字符串:

“String 1”

“String 2”

“String 3”

“String 15”

“String 17”

我想要按照上面的方式对字符串进行排序。但是,当我使用SortDescription对列表进行排序时,我得到以下输出:

“String 1”

“String 15”

“String 17”

“String 2”

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

似乎我只有两个排序选项是Ascending和Descending。但是它对CollectionView进行排序的方式并不是我想要对字符串进行排序的方式。有没有一种简单的方法可以解决这个问题?

2 个答案:

答案 0 :(得分:4)

通过链接Natural Sort Order in 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();
    }

答案 1 :(得分:1)

您可以使用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",