如何使用命名委托给List.Sort()的比较?

时间:2012-07-08 21:34:42

标签: c# delegates

在我的应用中,我有几种比较方法。我希望用户能够选择要使用的排序方法。理想情况下,我想设置一个委托,它会根据用户的选择进行更新。这样,我可以使用List.Sort(委托)保持代码通用。

这是我第一次尝试使用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类型的列表。我做错了什么?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:3)

Sort采用Comparison<T>委托类型,而不是SortVideos委托类型。

您根本不应该创建委托类型 相反,只需写

videos.Sort(SomeMethod);