C# CollectionViewSource排序算法
如何更改CollectionViewSource的排序算法?事实上,我发现CollectionViewSource的排序算法并不稳定。我想在CollectionViewSource上使用一个稳定的算法。我该怎么办呢?您可能想退房 简而言之,将比较器设置为:C# CollectionViewSource排序算法,c#,sorting,collectionviewsource,C#,Sorting,Collectionviewsource,如何更改CollectionViewSource的排序算法?事实上,我发现CollectionViewSource的排序算法并不稳定。我想在CollectionViewSource上使用一个稳定的算法。我该怎么办呢?您可能想退房 简而言之,将比较器设置为: private void Sort(object sender, RoutedEventArgs args) { BlogPosts posts = (BlogPosts)(this.Resources["posts"]);
private void Sort(object sender, RoutedEventArgs args)
{
BlogPosts posts = (BlogPosts)(this.Resources["posts"]);
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(posts));
lcv.CustomSort = new SortPosts();
}
public class SortPosts : IComparer
{
public int Compare(object x, object y)
{
(…)
}
}
并按如下方式实施:
private void Sort(object sender, RoutedEventArgs args)
{
BlogPosts posts = (BlogPosts)(this.Resources["posts"]);
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(posts));
lcv.CustomSort = new SortPosts();
}
public class SortPosts : IComparer
{
public int Compare(object x, object y)
{
(…)
}
}
你可能想退房 简而言之,将比较器设置为:
private void Sort(object sender, RoutedEventArgs args)
{
BlogPosts posts = (BlogPosts)(this.Resources["posts"]);
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(posts));
lcv.CustomSort = new SortPosts();
}
public class SortPosts : IComparer
{
public int Compare(object x, object y)
{
(…)
}
}
并按如下方式实施:
private void Sort(object sender, RoutedEventArgs args)
{
BlogPosts posts = (BlogPosts)(this.Resources["posts"]);
ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(posts));
lcv.CustomSort = new SortPosts();
}
public class SortPosts : IComparer
{
public int Compare(object x, object y)
{
(…)
}
}
我已经设法用一个自定义比较器获得了一个稳定的排序,但它有点像一个大黑客 正如Benjamin所建议的,我从集合中获取ListCollectionView,并使用自定义比较器设置其CustomSort属性。唯一的区别是,我在实例化集合时将其传递给比较器
private void Sorting(IEnumerable collection)
{
var view = CollectionViewSource.GetDefaultView(collection) as ListCollectionView;
if (view != null)
{
view.CustomSort = new StableComparer(collection);
}
}
然后,在我的自定义比较器中,我使用Compare方法中的集合只是在比较返回零(它们相同或具有相同的值)时回退到items索引
我还在测试这个,所以我不能保证它会一直工作。。。例如,一个问题是使比较器中的集合属性保持更新。或者支持两个排序方向
但是我认为这个想法很清楚,尽管像我说的那样有点粗糙。我已经设法使用自定义比较器获得了一个稳定的排序,但它有点像是一个大难题 正如Benjamin所建议的,我从集合中获取ListCollectionView,并使用自定义比较器设置其CustomSort属性。唯一的区别是,我在实例化集合时将其传递给比较器
private void Sorting(IEnumerable collection)
{
var view = CollectionViewSource.GetDefaultView(collection) as ListCollectionView;
if (view != null)
{
view.CustomSort = new StableComparer(collection);
}
}
然后,在我的自定义比较器中,我使用Compare方法中的集合只是在比较返回零(它们相同或具有相同的值)时回退到items索引
我还在测试这个,所以我不能保证它会一直工作。。。例如,一个问题是使比较器中的集合属性保持更新。或者支持两个排序方向
但正如我所说,我认为这个想法很清楚,尽管很粗糙。这个案例为两个对象之间的比较开辟了新的途径。但是它能改变排序算法的稳定性吗?这取决于你如何实现你的
icomparaer
。你能给出更多细节吗?如何使用IComparer制作稳定的排序算法?谢谢你,你可以继续比较,直到你发现两者之间的差异。e、 你在比较“abc”和“aac”。比较第一个字符时,它们是相同的。要获得稳定的排序,请继续比较下一个字符,直到找到差异。但是排序算法的稳定性取决于排序算法的逻辑。这种情况只是在两个对象之间设置了一种新的比较方式。但是它能改变排序算法的稳定性吗?这取决于你如何实现你的icomparaer
。你能给出更多细节吗?如何使用IComparer制作稳定的排序算法?谢谢你,你可以继续比较,直到你发现两者之间的差异。e、 你在比较“abc”和“aac”。比较第一个字符时,它们是相同的。要获得稳定的排序,请继续比较下一个字符,直到找到差异。因此,您可以与第二个字符进行比较。但是排序算法的稳定性取决于排序算法的逻辑