2017-11-02 1 views
2

Also ich versuche zu bestimmen, ob ein Array von identischen Werten innerhalb eines Stapels ist. HierWie ermittelt man, ob sich ein Array in einem Stapel befindet?

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

ist der Ausgang für Code, wie es ist:

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 

Meine Forschung in dieser hat viele Ergebnisse für das Sehen aufgedreht, wenn ein Array in einem anderen Array ist oder eine Teilmenge einer anderen Array, was ich über SequenceEqual erfahren habe. Wenn man sieht, dass das nur in der Lage ist, den obersten Wert im Stapel zu überprüfen, ist es für das, was ich will, nicht geeignet.

Eine alternative Lösung, die ich in Erwägung gezogen habe, wäre, den Stack auf einen neuen Stack zu stapeln und jedes Array zu überprüfen, wenn es umgestellt wird. Wenn man jedoch bedenkt, dass contains einen ganzen Stack nach Werten vom Typ string durchsuchen kann, bleibt mir die Schlussfolgerung, dass es für Werte vom Typ int [] möglich sein sollte. Wenn nicht, wäre eine Anleitung zur bestmöglichen Problemumgehung wünschenswert.

+1

Sie möchten wissen, ob ** irgendein ** Element des Stapels ** Sequenz gleich ** zu einem bestimmten Wert ist. Gibt Ihnen das eine Vorstellung davon, wie Sie es implementieren? –

+0

Wenn Sie möchten, dass Contains() funktioniert, dann müssen Sie einen IEqualityComparer mitbringen, der mehr als den Standardwert liefert, der nur nach Objektidentität sucht. –

Antwort

0

Verwenden LINQ Any statt Contains zur Eindämmung Kontrollen auf anderen Bedingungen als Gleichheit:

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

Dies entspricht eine „enthält, wenn ...“ Implementierung für einen beliebigen Zustand.

+1

@EricLippert Sie haben Recht, kopiere ich die Zeichenfolge von OP, ohne sie zu lesen. Vielen Dank! – dasblinkenlight

Verwandte Themen