我有以下字符串:
“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进行排序的方式并不是我想要对字符串进行排序的方式。有没有一种简单的方法可以解决这个问题?
答案 0 :(得分:4)
[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",