如何在 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;
}