2

私のアプリには、いくつかの比較方法があります。ユーザーが使用する並べ替え方法を選択できるようにしたいと思います。理想的には、デリゲートを設定したいと思います。ユーザーの選択に基づいて更新されます。このようにして、List.Sort(delegate) を使用してコードを汎用的に保つことができます。

C# デリゲートを使用するのはこれが初めてで、構文エラーが発生しています。これが私がこれまでに持っているものです:

デリゲート:

private delegate int SortVideos(VideoData x, VideoData y);
private SortVideos sortVideos;

クラスコンストラクターで:

sortVideos = Sorting.VideoPerformanceDescending;

public static Sorting クラスの比較メソッド (直接呼び出すと機能します):

public static int VideoPerformanceDescending(VideoData x, VideoData y)
{
    *code statements*
    *return -1, 0, or 1*
}

「いくつかの無効な引数」を訴える失敗した構文:

videos.Sort(sortVideos);

最終的に、「sortVideos」を変更して、選択したメソッドを指すようにしたいと思います。「videos」はタイプ VideoData のリストです。私は何を間違っていますか?

4

2 に答える 2

5

は型のList<T>デリゲートを受け入れるComparison<T>ため、独自のデリゲートを定義することはできません。デリゲートを再利用するだけで済みますComparison<T>

private static Comparison<VideoData> sortVideos;

static void Main(string[] args)
{
    sortVideos = VideoPerformanceDescending;

    var videos = new List<VideoData>();

    videos.Sort(sortVideos);
}

回答を拡張してユーザー選択部分も検討すると、使用可能なオプションを辞書に保存し、UI でユーザーが辞書のキーを選択してソート アルゴリズムを選択できるようになります。

private static Dictionary<string, Comparison<VideoData>> sortAlgorithms;

static void Main(string[] args)
{
    var videos = new List<VideoData>();

    var sortAlgorithms = new Dictionary<string, Comparison<VideoData>>();

    sortAlgorithms.Add("PerformanceAscending", VideoPerformanceAscending);
    sortAlgorithms.Add("PerformanceDescending", VideoPerformanceDescending);

    var userSort = sortAlgorithms[GetUserSortAlgorithmKey()];

    videos.Sort(userSort);
}

private static string GetUserSortAlgorithmKey()
{
    throw new NotImplementedException();
}

private static int VideoPerformanceDescending(VideoData x, VideoData y)
{
    throw new NotImplementedException();
}

private static int VideoPerformanceAscending(VideoData x, VideoData y)
{
    throw new NotImplementedException();
}
于 2012-07-08T21:43:27.207 に答える
3

SortComparison<T>デリゲート型ではなく、デリゲート型を取りますSortVideos

デリゲート型を作成するべきではありません。
代わりに、書くだけ

videos.Sort(SomeMethod);
于 2012-07-08T21:43:36.607 に答える