如何在 C++/CLI 中使用 Linq Any()
How to use Linq Any() in C++/CLI
我想在 C++Cli 中复制 C# 代码,但我没有在 google 和 Whosebug
中找到任何 "Any()" linq 示例
C#代码
private static void Main(string[] args)
{
var grettings = new List<string>()
{
"Hey",
"Hi",
"How"
};
var currentGreeting = "Hey are you ok ?";
var b = grettings.Any(a => currentGreeting.Contains(a));
if (b)
{
Console.WriteLine("It is a greeting");
}
}
C++ CLi 尝试
static bool Lambda(String^ lambdaObj, String^ objName)
{
return objName->Contains(lambdaObj);
}
static MinionType GetMinionType(obj_AI_Minion^ minion)
{
if(minion != nullptr)
{
auto skinName = minion->CharDataInfo->BaseSkinName;
auto any = Enumerable::Any(LaneMinionsNames, gcnew Func<String^, String^, bool>(&Lambda));
if(any)
{
}
}
return None;
};
错误
您的 lambda-ish 函数需要是:
static bool Lambda(String^ objName)
{
return currentGreeting->Contains(lambdaObj);
}
我对 C++/CLI 不了解 currentGreeting
的具体方法,
更新:好的,这在 C# 中有效:
void Main()
{
var grettings = new List<string>()
{
"Hey",
"Hi",
"How"
};
var currentGreeting = "Hey are you ok ?";
var b = grettings.Any(BundleLambda(currentGreeting) );
b.Dump();
}
public static Func<string, bool> BundleLambda(string target)
{
return a=> target.Contains(a);
}
这里甚至不需要 lambda。
简化的 C# 版本:
var b = greetings.Any(currentGreeting.Contains);
因为这是无捕获的,所以 C++/CLI 版本很简单:
auto b = Enumerable::Any(greetings,
gcnew Func<String^, bool>(currentGreeting,
&System::String::Contains));
我发现有必要使用 "Helper" class。
这是一个稍微复杂一点的示例,它检查两个字符串数组是否相互比较,以查看一个数组是否包含另一个数组中字符串的子字符串。
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Linq;
////////////////////////////////////////////////////////////////////////////////
// Helper class to manage the String::Contains where a higher scope string
// is presented for comparison
public ref class CHelperStringContains
{
private:
static property String^ _strPiece;
static bool _contains(String^ str) { return str->Contains(_strPiece); }
public:
CHelperStringContains(String^ strPiece) { _strPiece = strPiece; }
Func<String^, bool>^ Contains = gcnew Func<String^, bool>(_contains);
};
////////////////////////////////////////////////////////////////////////////////
// Helper class to manage IEnumerable::Contains where a higher scope
// IEnumerable::String is presented for comparison
public ref class CHelperArrayContains
{
private:
static property IEnumerable<String^>^ _arr_strSources;
static bool _anyContains(String^ strPiece)
{
return Enumerable::Any<String^>(_arr_strSources, (gcnew CHelperStringContains(strPiece))->Contains);
}
public:
CHelperArrayContains(IEnumerable<String^>^ arr_strSources) { _arr_strSources = arr_strSources; }
Func<String^, bool>^ AnyContains = gcnew Func<String^, bool>(_anyContains);
};
int main(void)
{ // Warning Level 4 / Warnings as Errors
IEnumerable<String^>^ arr_strSources = gcnew array<String^>{ "Alpha", "Bravo", "Charlie", "Delta" };
IEnumerable<String^>^ arr_strPieces = gcnew array<String^>{ "phha", "lie", "zelt" };
//--------------------------- MEAT ----------------------------------------
// Check to see if any of the sources contain any of the substring pieces
// How it looks in C#
// bool blnRetVal = arr_strPieces.Any(strPiece => arr_strSources.Any(strData => strData.Contains(strPiece)));
bool blnRetVal = Enumerable::Any<String^>(arr_strPieces, (gcnew CHelperArrayContains(arr_strSources))->AnyContains);
System::Diagnostics::Debug::WriteLine("Found = {0}", blnRetVal);
//-------------------------------------------------------------------------
return 0;
}
我想在 C++Cli 中复制 C# 代码,但我没有在 google 和 Whosebug
中找到任何 "Any()" linq 示例C#代码
private static void Main(string[] args)
{
var grettings = new List<string>()
{
"Hey",
"Hi",
"How"
};
var currentGreeting = "Hey are you ok ?";
var b = grettings.Any(a => currentGreeting.Contains(a));
if (b)
{
Console.WriteLine("It is a greeting");
}
}
C++ CLi 尝试
static bool Lambda(String^ lambdaObj, String^ objName)
{
return objName->Contains(lambdaObj);
}
static MinionType GetMinionType(obj_AI_Minion^ minion)
{
if(minion != nullptr)
{
auto skinName = minion->CharDataInfo->BaseSkinName;
auto any = Enumerable::Any(LaneMinionsNames, gcnew Func<String^, String^, bool>(&Lambda));
if(any)
{
}
}
return None;
};
错误
您的 lambda-ish 函数需要是:
static bool Lambda(String^ objName)
{
return currentGreeting->Contains(lambdaObj);
}
我对 C++/CLI 不了解 currentGreeting
的具体方法,
更新:好的,这在 C# 中有效:
void Main()
{
var grettings = new List<string>()
{
"Hey",
"Hi",
"How"
};
var currentGreeting = "Hey are you ok ?";
var b = grettings.Any(BundleLambda(currentGreeting) );
b.Dump();
}
public static Func<string, bool> BundleLambda(string target)
{
return a=> target.Contains(a);
}
这里甚至不需要 lambda。
简化的 C# 版本:
var b = greetings.Any(currentGreeting.Contains);
因为这是无捕获的,所以 C++/CLI 版本很简单:
auto b = Enumerable::Any(greetings,
gcnew Func<String^, bool>(currentGreeting,
&System::String::Contains));
我发现有必要使用 "Helper" class。 这是一个稍微复杂一点的示例,它检查两个字符串数组是否相互比较,以查看一个数组是否包含另一个数组中字符串的子字符串。
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Linq;
////////////////////////////////////////////////////////////////////////////////
// Helper class to manage the String::Contains where a higher scope string
// is presented for comparison
public ref class CHelperStringContains
{
private:
static property String^ _strPiece;
static bool _contains(String^ str) { return str->Contains(_strPiece); }
public:
CHelperStringContains(String^ strPiece) { _strPiece = strPiece; }
Func<String^, bool>^ Contains = gcnew Func<String^, bool>(_contains);
};
////////////////////////////////////////////////////////////////////////////////
// Helper class to manage IEnumerable::Contains where a higher scope
// IEnumerable::String is presented for comparison
public ref class CHelperArrayContains
{
private:
static property IEnumerable<String^>^ _arr_strSources;
static bool _anyContains(String^ strPiece)
{
return Enumerable::Any<String^>(_arr_strSources, (gcnew CHelperStringContains(strPiece))->Contains);
}
public:
CHelperArrayContains(IEnumerable<String^>^ arr_strSources) { _arr_strSources = arr_strSources; }
Func<String^, bool>^ AnyContains = gcnew Func<String^, bool>(_anyContains);
};
int main(void)
{ // Warning Level 4 / Warnings as Errors
IEnumerable<String^>^ arr_strSources = gcnew array<String^>{ "Alpha", "Bravo", "Charlie", "Delta" };
IEnumerable<String^>^ arr_strPieces = gcnew array<String^>{ "phha", "lie", "zelt" };
//--------------------------- MEAT ----------------------------------------
// Check to see if any of the sources contain any of the substring pieces
// How it looks in C#
// bool blnRetVal = arr_strPieces.Any(strPiece => arr_strSources.Any(strData => strData.Contains(strPiece)));
bool blnRetVal = Enumerable::Any<String^>(arr_strPieces, (gcnew CHelperArrayContains(arr_strSources))->AnyContains);
System::Diagnostics::Debug::WriteLine("Found = {0}", blnRetVal);
//-------------------------------------------------------------------------
return 0;
}