出于好奇(我只是想知道它是如何在C#中完成的)你如何为一个函数/方法提供策略?例如,如果我有一个在C ++中排序的函数,我可以这样做:
std::sort(v.begin(),v.end(), Comparator<char>());
其中v是向量,v.begin是它的开头,v.end结束了这个向量,这个好奇的Comparator()是一个策略,它指定要对这个向量进行排序的是什么。例如,可以忽略char等的情况进行排序 你会如何在C#中做同样的事情?
答案 0 :(得分:3)
对于排序,您通常会传递Comparison<T>
或IComparer<T>
。这可以用来比较任何两个元素。 (IComparer<T>
实际上是Comparison<T>
委托的接口形式。)
所以对于排序示例:
// Using IComparer<T>
listOfStrings.Sort(StringComparer.OrdinalIgnoreCase);
// Handy default comparer...
listOfInts.Sort(Comparer<int>.Default);
// Using Comparison<T> in a slightly odd way (sorting dates by day of month)
listOfDates.Sort((x, y) => x.Day.CompareTo(y.Day));
一般情况下,使用委托时,从.NET 3.5和C#3(使创建委托变得轻而易举)可以使事情变得非常简单,只需要一个操作来确定“策略”。但是,对于相等的事情,您可能需要使用多个操作,因此界面变得有用 - 例如,IEqualityComparer<T>
同时包含Equals
和GetHashCode
方法。