gpt4 book ai didi

c# - 如何在 C++ 中像仿函数一样使用 C# 委托(delegate)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:16 25 4
gpt4 key购买 nike

在 C++ 中,要对 vector 、列表或任何集合进行排序,我会使用:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
vector<int> vt;
vt.push_back( 3 );
vt.push_back( 1 );
vt.push_back( 2 );
sort( vt.begin(), vt.end(), greater<int>() );
}

在 C# 中,我发现 List<>相当于std::vector<> :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Professional_Csharp {
class Program {
static void Main( string[] args ) {
List<int> intList = new List<int>();
intList.Add( 3 );
intList.Add( 2 );
intList.Add( 1 );
intList.Sort();
}
}
}

这很好用,但是如果我想自定义比较器,我该如何实现呢?或者如果我只想对特定范围而不是整个列表进行排序?我怎么能那样做?

更新

sort( vt.begin(), vt.begin() + 1 );

在 C# 中可以吗?

谢谢,

最佳答案

在整个 .NET 框架中,您偶尔会发现具有一个或多个重载的方法(如 Sort),这些重载接受其他类型(接口(interface)或委托(delegate))以扩展其行为。与 C++ 不同,.NET 没有与 STL 相同的可组合算法方法。

List.Sort的情况下您可能会发现有两个重载很有用:

List.Sort( IComparer<T> comparer )    // and
List.Sort( Comparison<T> comparison ) // .NET 4.0 and up

第一个重载接受一个实现了 IComparer<T> 的类型的实例- 具有单一方法的接口(interface) Compare .第二个重载仅在您使用 .NET 4.0 或更新版本时可用 - 它接受提供比较语义的委托(delegate)(或 lambda 表达式)。

如果可以的话,第二个重载会更容易使用:

intList.Sort( (a,b) => YourCompare(a,b) /* your compare logic here */ );

要使用第一个重载,您必须创建一个实现 IComparer<T> 的类或结构:

public sealed class YourComparer : IComparer<YourType>
{
int Compare( YourType a, YourType b ) { ... }
}

intList.Sort( new YourComparer() );

如果您不想改变集合本身,而只想对它的项目进行排序并将它们作为一个新序列进行操作,您可以使用 LINQ 的 OrderBy运算符(operator):

intList.OrderBy( x => ... ).ToArray() /* creates new sequence, won't alter intList */


要回答问题的第二部分,如果您只想对特定集合的特定范围进行排序,则必须使用 Sort( int, int, IComparer<T> )重载。

关于c# - 如何在 C++ 中像仿函数一样使用 C# 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com