Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数/方法中的策略_C# - Fatal编程技术网

C# 函数/方法中的策略

C# 函数/方法中的策略,c#,C#,出于好奇(我只是想知道它是如何在C#中实现的)您是如何为函数/方法提供策略的?例如,如果我有C++中的函数,我可以做这样的事情:< /P> std::sort(v.begin(),v.end(), Comparator<char>()); 排序(v.begin(),v.end(),Comparator()); 其中v是一个向量,v.begin是它的开始,v.end是这个向量的结束,这个奇怪的比较器()是一个策略,它指定这个向量的排序标准。例如,排序将忽略字符大小写等。 你会如何在

出于好奇(我只是想知道它是如何在C#中实现的)您是如何为函数/方法提供策略的?例如,如果我有C++中的函数,我可以做这样的事情:< /P>
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不同的类型上使用它,而无需重新实现或从头编写类似的算法?请提供(如果可能,请扩展)这样做的例子?至于只对容器的一部分进行分类,嗯,恰恰相反,我经常这样做。