2017-05-31 2 views
-2

に私はC++ CLIでC#のコードを複製したいのですが、私はdidntの)C++/CLI

C#のGoogleでもstackoverflowの内いずれかの "任意の()" 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# - CLIラムダは、C#のバージョンが1になると2つの引数を取るのですか? –

+0

さて、私はC++のC++で "a"にアクセスする方法を知っていません。名前にそれが含まれているかどうかを調べるために、それは私のstrugleです –

+0

管理クラスを作成し、関数はそのクラスの非静的メンバーになります。これは、C#コンパイラが通常、変数を取得するために行う処理です。 –

答えて

1

ここでもラムダは必要ありません。

簡体C#バージョン:

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

と、これは、キャプチャ、無料ですので、C++/CLIのバージョンは単純です:

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

はちょうどC#バージョンの削除にあなたを補正し、どうもありがとう「=>」と、それはMá[email protected] –

+0

作品:おっと、私はその後、何のラムダを意味していないし、なかったですコードにはまだ1つしかありませんでした。あなたがそれを理解してうれしいです。 –

0

あなたのラムダっぽい機能があることが必要である:

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

あなたは

UPDATE、私の知識OT C++/CLIを超えているにcurrentGreetingを得ることができます正確にどのように: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

私はそれが必要な "ヘルパー" クラスを使用することを発見しました。 ここでは、文字列の2つの配列をお互いにチェックして、1つの配列に別の配列の文字列の部分文字列が含まれているかどうかを調べる、もう少し複雑な例を示します。

#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'を使う理由はありません。 (そして、他のシングルスレッドのケースでは、リエントラントの喪失が問題になるかもしれません) –