在我的应用中,我有几种比较方法。我希望用户能够选择要使用的排序方法。理想情况下,我想设置一个委托,它会根据用户的选择进行更新。这样,我可以使用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类型的列表。我做错了什么?
答案 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);