2012-07-27 112 views
0

我有一个自定义比较器,我想使用OrderBy。这个比较器可以按我想要的方式对嵌套列表进行排序。我完全在其他地方工作,但我无法按照我想要的方式使用Linq。你能告诉我我错了吗?IComparer,OrderBy和Linq

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

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; 
     } 
    } 
} 

private void SortDirectoriesDescending(object sender, RoutedEventArgs e) 
    { 
     ObservableCollection<BaseDirectory> tempDir = new ObservableCollection<BaseDirectory>(
      Directories.OrderBy(directory => directory, new VideoEntityComparer(false))); 
     Directories = tempDir; 
    } 
+1

定义“你想要的方式”。这是我想的答案的关键。在执行比较器或将其插入'OrderBy'方法中是否存在问题?对'OrderBy'的调用看起来是正确的。 – 2012-07-27 08:02:07

+0

我刚刚在编辑中定义了“我想要的方式”;) – Sheamus 2012-07-27 08:58:40

+0

由于您的SortDirectoriesDescending方法正在使用新的已排序集合替换目录集合,而不是就地排序,因此如果已采用“目录”在调用排序方法之前,您将看不到新的排序顺序。您可能需要提供更多的代码(特别是任何使用“目录”的代码和调用SortDirectoriesDescending的代码部分)来确定问题,因为实际情况是一切都很正常。 – Iridium 2012-07-27 10:44:58

回答

1

试着做如下修改您的比较方法:

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; 
    } 
} 

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

+0

是的,谢谢。我错过了。 – Sheamus 2012-07-27 08:52:37

+0

@Samus是否解决了这个问题,或者它仍然无法正常工作? – Iridium 2012-07-27 09:38:59

+0

没有比较器不是原因。但我错过了这种情况;) – Sheamus 2012-07-27 10:14:12