首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparer、OrderBy和Linq

IComparer、OrderBy和Linq
EN

Stack Overflow用户
提问于 2012-07-27 08:00:46
回答 1查看 3.9K关注 0票数 0

我有一个定制的比较器,我想用在OrderBy上。此比较器允许以我想要的方式对嵌套列表进行排序。我在其他地方工作得很好,但我不能让它按照我想要的方式和Linq一起工作。你能告诉我哪里错了吗?

编辑:我想让它工作的方式是首先按类对我的实体进行分组(BaseDirectory > BaseSite > VideoEntity,总是这样),然后按字母顺序对它们进行排序(升序= A->Z或降序Z->A)。无论如何,当我使用SortDirectoriesDescending()时,将返回按升序排序的集合。默认情况下,集合是在升序模式下排序的(因此转换器可以工作,我已经测试过它是否降序,好的)

代码语言:javascript
复制
public class VideoEntityComparer : IComparer<VideoEntity>
{

    int order = 1;

    public VideoEntityComparer(Boolean ascending)
    {
        if (!ascending)
        {
            this.order = -1; // so descending
        }
    }

    public VideoEntityComparer()
    {

    }

    public int Compare(VideoEntity x, VideoEntity y)
    {
        if ((x is BaseDirectory && y is BaseDirectory) || (x is BaseSite && y is BaseSite) || (x is VideoEncoder && y is VideoEncoder))
        {
            return string.Compare(x.Nom, y.Nom, false) * order; // only objects of the same type are sorted alphabetically
        }
        else if ((x is BaseDirectory && y is BaseSite) || (x is BaseSite && y is VideoEncoder))
        {
            return -1;
        }else
        {
            return 1;
        }
    }
}

代码语言:javascript
复制
private void SortDirectoriesDescending(object sender, RoutedEventArgs e)
    {
        ObservableCollection<BaseDirectory> tempDir  = new ObservableCollection<BaseDirectory>(
            Directories.OrderBy(directory => directory, new VideoEntityComparer(false)));
        Directories = tempDir;
    }
EN

回答 1

Stack Overflow用户

发布于 2012-07-27 08:09:02

尝试对您的比较方法进行以下更改:

代码语言:javascript
复制
public int Compare(VideoEntity x, VideoEntity y)
{
    if ((x is BaseDirectory && y is BaseDirectory) || (x is BaseSite && y is BaseSite) || (x is VideoEncoder && y is VideoEncoder))
    {
        return string.Compare(x.Nom, y.Nom, false) * order; // only objects of the same type are sorted alphabetically
    }
    else if ((x is BaseDirectory && y is BaseSite) || (x is BaseSite && y is VideoEncoder) || (x is BaseDirectory && y is VideoEncoder)) // Added (x is BaseDirectory && y is VideoEncoder)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}

您的代码以前定义了order BaseDirectory < BaseSite和BaseSite < VideoEncoder,但是BaseDirectory > VideoEncoder,这可能会混淆OrderBy,因为排序不是传递的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11683749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档