2017-11-02 3 views
2

したがって、同じ値の配列がスタック内にあるかどうかを判断しようとしています。配列が別の配列であるか、別のサブセットである場合は、この中配列がスタックにあるかどうかを調べる方法は?

stackOfString contains cat: True 
stackOfString contains dog: True 
SequenceEqual can compare arrays of identical value: True 
SequenceEqual can be used to compare the top value of a stack: True 
Contains can be used to determine if an array of values is within the stack: False 

私の研究は見ての結果の多くを上げています:それはあるとしてここ

Stack<string> stackOfStrings = new Stack<string>(); 
stackOfStrings.Push("dog"); 
stackOfStrings.Push("cat"); 
Debug.WriteLine("stackOfString contains cat: " + 
    stackOfStrings.Contains("cat")); 
Debug.WriteLine("stackOfString contains dog: " + 
    stackOfStrings.Contains("dog")); 

Stack<int[]> stackOfIntArrays = new Stack<int[]>(); 
stackOfIntArrays.Push(new int[]{0,1}); 
stackOfIntArrays.Push(new int[]{1,1}); 
int[] array01 = new int[]{0,1}; 
int[] anotherArray01 = new int[]{0,1}; 
int[] array11 = new int[] { 1, 1 }; 

Debug.WriteLine("SequenceEqual can compare arrays of identical value: " + array01.SequenceEqual(anotherArray01)); 
Debug.WriteLine("SequenceEqual can be used to compare the top value of a stack: " + stackOfIntArrays.Peek().SequenceEqual(array11)); 
//I want the line below to evaluate to true 
Debug.WriteLine("Contains can be used to determine if an array of values is within the stack: " + stackOfIntArrays.Contains(array01)); 

は、コードの出力であります配列、これは私がSequenceEqualについて学んだ方法です。それがスタックの最高の価値をチェックすることができるように見えるのを見て、それは私が望むものには不十分です。

私が考えた別の解決策は、スタックを新しいスタックに再スタックし、各アレイを移動したときにチェックすることです。しかし、containsが文字列型の値全体に対してスタック全体を見ることができるということを考慮すると、int []型の値に対して可能でなければならないという結論が出てきます。そうでない場合は、最善の回避策のガイダンスをいただければ幸いです。

+1

スタックの**任意の**要素が特定の値に**シーケンス等しい**であるかどうかを知りたいとします。それはあなたにそれを実装する方法のアイデアを与えますか? –

+0

Contains()が機能するようにするには、オブジェクトのアイデンティティのみをチェックするデフォルトのものより多くを実行するIEqualityComparerが必要です。 –

答えて

0

使用LINQの平等以外の条件での封じ込めチェックのためAny代わりのContains

これは、任意の条件のために「含まれている場合は...」実装になる
Debug.WriteLine(
    "Enumerable.Any can be used to determine if an array of values is within the stack: {0}" 
, stackOfIntArrays.Any(a => array01. SequenceEqual(a)) 
); 

+1

@EricLippertそうです、私はOPの文字列をそれを読まずにコピーしました。ありがとうございました! – dasblinkenlight

関連する問題