2017-05-31 89 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',它破壞了線程安全性,沒有任何好處。 (並且在其他單線程情況下,重入損失可能是一個問題) –