C# 函数/方法中的策略
出于好奇(我只是想知道它是如何在C#中实现的)您是如何为函数/方法提供策略的?例如,如果我有C++中的函数,我可以做这样的事情:< /P>C# 函数/方法中的策略,c#,C#,出于好奇(我只是想知道它是如何在C#中实现的)您是如何为函数/方法提供策略的?例如,如果我有C++中的函数,我可以做这样的事情:< /P> std::sort(v.begin(),v.end(), Comparator<char>()); 排序(v.begin(),v.end(),Comparator()); 其中v是一个向量,v.begin是它的开始,v.end是这个向量的结束,这个奇怪的比较器()是一个策略,它指定这个向量的排序标准。例如,排序将忽略字符大小写等。 你会如何在
std::sort(v.begin(),v.end(), Comparator<char>());
排序(v.begin(),v.end(),Comparator());
其中v是一个向量,v.begin是它的开始,v.end是这个向量的结束,这个奇怪的比较器()是一个策略,它指定这个向量的排序标准。例如,排序将忽略字符大小写等。你会如何在C#中做同样的事情?对于排序,你通常会传入a或a。可以用来比较任意两个元素。(
IComparer
实际上是比较
委托的接口形式。)
因此,对于排序示例:
// 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));
//使用IComparer
排序(StringComparer.OrdinalIgnoreCase);
//方便的默认比较器。。。
排序(Comparer.Default);
//以一种稍微奇怪的方式使用比较(按月份的日期排序)
排序((x,y)=>x.Day.CompareTo(y.Day));
一般来说,从.NET3.5和C#3开始(创建委托很容易),当您只需要一个操作来确定“策略”时,使用委托可以使事情变得非常简单。但是,对于相等之类的操作,您可能需要使用多个操作,因此接口变得非常有用-
IEqualityComparer
同时具有Equals
和GetHashCode
方法。例如,对于排序,您通常会传入一个或一个。可以用来比较任意两个元素。(IComparer
实际上是比较
委托的接口形式。)
因此,对于排序示例:
// 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));
//使用IComparer
排序(StringComparer.OrdinalIgnoreCase);
//方便的默认比较器。。。
排序(Comparer.Default);
//以一种稍微奇怪的方式使用比较(按月份的日期排序)
排序((x,y)=>x.Day.CompareTo(y.Day));
一般来说,从.NET3.5和C#3开始(创建委托很容易),当您只需要一个操作来确定“策略”时,使用委托可以使事情变得非常简单。然而,对于相等之类的东西,您可能需要使用多个操作,因此接口变得非常有用-
IEqualityComparer
同时具有Equals
和GetHashCode
方法。因此,请您提供一个示例。我只是想看看语法和它在美学上的外观。@Jon第一个例子,所以我理解用户可以自己(或其他一些策略)实现“策略”OrdinalingOreCase,并在字符串对象上使用它?例如,如果我想按颠倒的字典顺序对它们进行排序,我会定义字典的倒数,并使用它而不是OridinalIgnoreCase?那么,只对容器的一部分进行排序呢?例如,从一个5000万的数据库中只找到前2000条记录?@我们无能为力:你要用它来比较一对字符串。请注意,OrdinalIgnoreCase
只是StringComparer类上的一个静态属性,它返回一个StringComparer,该StringComparer实现了IComparer
。不过,你可以自己实现你的IComparer
,它只是一个接口。至于只对容器的一部分进行排序,老实说,我不记得在.NET中看到过这样做的任何东西。。。我也不记得我想要它。在LINQ中,您可以执行OrderBy(…)。不过请执行(2000)。@Jon对响应延迟表示抱歉。乔恩,所以我们可以逐行进行(只是接口,不介意实现细节),并且尝试在C++和C++中做同样的事情吗?我只是想看看代码是什么样子的,它的可伸缩性是什么。例如,如果我实现了LexReverse,我是否也能够在与string不同的类型上使用它,而无需重新实现或从头编写类似的算法?请提供(如果可能,请扩展)这样做的例子?至于只对容器的一部分进行分类,恰恰相反,我经常这样做。@Jon所以请你举个例子。我只是想看看语法和它在美学上的外观。@Jon第一个例子,所以我理解用户可以自己(或其他一些策略)实现“策略”OrdinalingOreCase,并在字符串对象上使用它?例如,如果我想按颠倒的字典顺序对它们进行排序,我会定义字典的倒数,并使用它而不是OridinalIgnoreCase?那么,只对容器的一部分进行排序呢?例如,从一个5000万的数据库中只找到前2000条记录?@我们无能为力:你要用它来比较一对字符串。请注意,OrdinalIgnoreCase
只是StringComparer类上的一个静态属性,它返回一个StringComparer,该StringComparer实现了IComparer
。不过,你可以自己实现你的IComparer
,它只是一个接口。至于只对容器的一部分进行排序,老实说,我不记得在.NET中看到过这样做的任何东西。。。我也不记得我想要它。在LINQ中,您可以执行OrderBy(…)。不过请执行(2000)。@Jon对响应延迟表示抱歉。乔恩,所以我们可以逐行进行(只是接口,不介意实现细节),并且尝试在C++和C++中做同样的事情吗?我只是想看看代码是什么样子的,它的可伸缩性是什么。例如,如果我实现了LexReverse,我是否也能够在与string不同的类型上使用它,而无需重新实现或从头编写类似的算法?请提供(如果可能,请扩展)这样做的例子?至于只对容器的一部分进行分类,嗯,恰恰相反,我经常这样做。