2012-07-27 73 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