2017-05-31 48 views
-2

我希望复制在C++ CLI中的C#代码,但我没有发现谷歌也没有在计算器如何使用Linq任何()在C++/CLI

C#任何 “任何()” LINQ例子代码

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; 
      }; 

错误

Error message

+0

为什么当C#版本只需要1时,C++ - CLI lambda需要2个参数? –

+0

嗯,我不知道如何访问我在C++上使用c的“a”来检查名称是否包含它,这是我的结构 –

+0

您将不得不创建一个托管类并将该字符串添加为成员,那么你的函数就成为该类的非静态成员。这就是C#编译器通常在底层捕获变量的功能。 –

回答

1

你在这里甚至不需要lambda。

简化了的C#版本:

var b = greetings.Any(currentGreeting.Contains); 

因为这是捕获免费的,C++/CLI版本很简单:

auto b = Enumerable::Any(greetings, 
         gcnew Func<String^, bool>(currentGreeting, 
                &System::String::Contains)); 
+0

非常感谢你,只是纠正你的C#版本删除“a =>”,它的工作原理 –

+0

@MárioGabriel:哎呀,我的意思是没有拉姆达,然后该代码仍然有一个。很高兴你想出来了。 –

0

你的λ-ISH功能必须是:

static bool Lambda(String^ objName) 
     { 
      return currentGreeting->Contains(lambdaObj); 
     } 

你究竟如何获得currentGreeting在没有超出我的知识OT C++/CLI,

UPDATE:OK,这个工程在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); 
} 
+0

是的,这是我需要的,谢谢你的时间:D –

0

我发现有必要使用一个 “助手” 类。 这是一个更复杂一点的示例,它检查两个字符串数组是否相互对应,以查看一个数组是否包含另一个数组中的字符串的子字符串。

#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; 
} 
+0

没有理由在这里使用'static',它破坏了线程安全性,没有任何好处。 (并且在其他单线程情况下,重入损失可能是一个问题) –