2016-09-25 11 views
0

2次元文字列に.Containsを使用して特定の文字列値が含まれているかどうかを確認する関数があります。 「文字列[]は」「含まれてい」と最高の の定義が含まれていませんstring [*、*]に 'Contains'の定義が含まれていません

System.Linqは、しかし、私はまだのエラーを取得し、同様の質問で問題になるようだとして、使用されています拡張メソッドオーバーロード 'Queryable.Contains(IQueryable、string)'には、 'IQueryable'タイプの受信者 が必要です。

このエラーは、比較値をどのように変更しても同じです。私はこのエラーが発生すると、私は、この目的のためにContainsを使用することができていたか否か、なぜ誰かが私に言うことを願って

string comparisonString = " "; 
bool victoryRequirement = mineArray.Contains(comparisonString); 

としてエラーoccuremceのためのコンテキストがあります。私は2次元アレイが部分的に故障していると考えていますが、私はその経験がありません。

+1

2Dアレイは、アレイの配列と同じではありません。 LINQは1次元配列用です。 – dasblinkenlight

+0

2d配列のすべての値を比較するための回避策または同様の方法がありますか?私の目的は2次元配列でなければならないからです。 – Marc

+0

独自の拡張メソッドを作成してみてください。ほとんどのLINQクエリメソッド( 'Contains'を含む)は拡張メソッドです。 –

答えて

2

あなたがあなた自身を書くことができますが、以下のような2次元の文字列配列のための方法が含まれています

public bool TwoDimensionalContains(string[,] inputArray, string comparisonString) 
{    
    for (int i = 0; i < inputArray.GetLength(0); i++) 
    { 
     for (int j = 0; j < inputArray.GetLength(1); j++) 
     {      
      // If matching element found, return true 
      if (comparisonString.Equals(inputArray[i, j])) 
       return true; 
     } 
    } 
    // No matchincg element found, return false 
    return false; 
} 

すると以下のようにそれを使用する:

string[,] myArray = new string[2, 2] 
{ 
    { "One", "Two" }, 
    { "Three", "Four" } 
}; 

bool contains = TwoDimensionalContains(myArray, "Three"); 

あなたはまたTwoDimensionalContains方法、拡張メソッドを作ることができます他のLinqメソッドとして使用することができます。

13

Adil Mammodovの回答はうまくいくように見えますが、あまり一般的ではありません。

public static IEnumerable<T> ToSequence<T>(this T[,] items) 
{ 
    return items.Cast<T>(); 
} 

をそして今、あなたは、単にシーケンスに配列を回すためにToSequenceを使用し、それにシーケンス演算子を適用することができます。私はずっと短く、より柔軟性としてこれを書くことが好ましいだろう。

myItems.ToSequence().Contains(target); 

また、私たちはあなたのコードを見ていますが、どのようなタイプであるのかに基づいて物事に名前を付けるようにしてください。あなたが物の名前に "Array"と "String"を持っていれば、それらはよりよく、より記述的な名前を持つことができます。型はすでにその型で注釈が付けられています。

+1

ジェネリックスを実装して私の方法を一般化することは可能ですが、これは方法ですより良いと受け入れるに値する答え。 –

1

実際にこの作品:

var c=myArray.Cast<string>().Select(x=>x).Contains("Three"); 

も容易:

var c=myArray.Cast<string>().Contains("Three"); 
+0

これは@EricLipertの答えに似ていて、ここでは「選択」が冗長です –

+0

ハ - そうです。私はラウンドアバウトの方法でそれについて来た:) – LoztInSpace

関連する問題