0

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

1 に答える 1

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 < VideoEncoder ですが、BaseDirectory > VideoEncoder の順序を定義していましたが、順序が推移的ではないため、混乱する可能性がありOrderByます。

于 2012-07-27T08:09:02.017 に答える