Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CollectionViewSource排序算法_C#_Sorting_Collectionviewsource - Fatal编程技术网

C# 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"]);

如何更改CollectionViewSource的排序算法?事实上,我发现CollectionViewSource的排序算法并不稳定。我想在CollectionViewSource上使用一个稳定的算法。我该怎么办呢?

您可能想退房

简而言之,将比较器设置为:

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”。比较第一个字符时,它们是相同的。要获得稳定的排序,请继续比较下一个字符,直到找到差异。因此,您可以与第二个字符进行比较。但是排序算法的稳定性取决于排序算法的逻辑