C# 让SortDescription对字符串进行不同的排序

C# 让SortDescription对字符串进行不同的排序,c#,wpf,sorting,gridview,C#,Wpf,Sorting,Gridview,我有以下字符串: “字符串1” “字符串2” “字符串3” “字符串15” “字符串17” 我希望字符串按上述方式排序。但是,当我使用SortDescription对列表进行排序时,会得到以下输出: “字符串1” “字符串15” “字符串17” “字符串2” “字符串3” 我知道有一些算法可以实现这一点,但是有没有办法利用SortDescription的内置功能实现这一点 private void SortCol(string sortBy, ListSortDirection directio

我有以下字符串:

“字符串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进行排序的方式不是我希望对字符串进行排序的方式。有没有一个简单的方法可以解决这个问题?

多亏了这个链接:

你可以用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())));

请向我们展示一些代码,以便我们从..@jsirr13开始工作,我认为您在这方面做得对!将此标记为副本是错误的。问题的背景完全不同。当然,有人可以用任何语言编写算法来进行排序,但这与xaml和视图绑定有关,以查看模型属性。@shawn1874同意-这个答案特别帮助我发现了集合视图上的“CustomSort”属性,而我忽略了它。如果你不想使用dll导入,编写你自己的比较器是很容易的。有关代码,请参阅此链接。我只是想知道,使用dll导入的缺点是什么?我认为在使用dll导入时可能会有一些注意事项,例如,处理非托管资源、文件大小略有增加、无法访问源代码。然而,我不相信我有足够的知识给你一个好的答案。对于这个特定的dll,如果您仔细阅读链接,您将看到功能随操作系统的不同而变化。您需要决定这是否是您的问题。如果您更喜欢托管解决方案(没有本机代码),您可以使用my类。它还添加了更多功能来定制订单。另一个问题:这只适用于单个列。除非您放弃它的灵活性,并在自定义比较器中硬编码多列排序,否则它无法取代多个sortdescription的使用。如果用户可以通过单击列标题进行排序,则不可用,即使只有一列。
    private void SortCol()
    {
        var dataView =
                      (ListCollectionView)CollectionViewSource.GetDefaultView(ListViewMultiSites.ItemsSource);
        dataView.CustomSort = new NaturalOrderComparer();
        dataView.Refresh();
    }
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",