2017-07-15 4 views
3

Ich arbeite an einem VB => C# -Übersetzer, und ich bin über VB-Code gelaufen, von dem ich nicht sicher bin, dass er eine direkte Übersetzung nach C# hat.C# -Äquivalent von {} .Contains() in VB

In VB können Sie so etwas wie

If {"a", "b", "c"}.Contains("c") Then ... 

(und seien wir etwas Nützliches vortäuschen, die nicht immer wahr sein wird) tun

Was ich mich, wenn ein Äquivalent von diesem gibt es in C#. Das nächste, was ich mit oben kommen kann ist

if (new object[] {"a", "b", "c"}.Contains("c")) { ... } 

Mein Problem dabei ist, dass ich die Art in C# definieren, was bedeutet, ich mit dem Objekt gehen müsste - da ich einen Übersetzer ich schreibe, es würde genauso gut für ein Array von int, Array von bool, Array von benutzerdefinierten Klassen usw. funktionieren. Ich bin mir nicht sicher, ob alles ein Objekt statt eines spezifischeren Typs sein sollte, ist eine gute Idee.

Gibt es eine Möglichkeit, den Compiler den Typ herauszufinden? Etwas logisch wie folgt aus: (Ich weiß, das nicht in Ordnung ist, aber etwas logisch äquivalent ...)

if (new var[] {"a", "b", "c"}.Contains("c")) { ... } 

so behandelt es das Array als ein Array von Strings und die Enthält Parameter als auch String?

Side Frage: Ich habe den Eindruck, dass der obige VB-Code behandelt {"a", "b", "c"} als ein Array von string. Ist das richtig? Behandelt der obige VB-Code "a", "b" und "c" als Objekte - falls ja, verwende ich auch das Objekt in C#.

+0

Verwenden Sie ToString(), um ein Objekt in eine Zeichenfolge zu konvertieren. – jdweng

+8

'neu [] {...}' –

Antwort

9

Wenn alle Array-Elemente den gleichen Typ sein, oder wenn sie unterschiedliche Typen sind, aber in einer Weise, dass erfüllt hierbei Typinferenz, können Sie eine implizit typisierte Array verwenden - wie var aber für Arrays, im Grunde:

if (new[] { "a", "b", "b" }.Contains("c")) 

Ich weiß nicht, ob das semantisch identisch mit dem VB-Code ist.

+0

Danke! Das sollte gut funktionieren :) – BrianH

+1

Einige technische Details. Der C# -Compiler prüft die Kompilierungszeittypen der drei Einträge und stellt fest, dass "string" der am besten passende Typ ist. Es wird also eine 'neue Zeichenkette [3]' (nicht ein 'Objekt []' wie in der Frage) gemacht. Dann, weil ein 'T []' ein 'IEnumerable ' ist, wird die Methode 'Contains' aus LINQ verwendet, die 'IEnumerable <>' erweitert. Dies wird die "EqualityComparer .Default" -Instanz verwenden, die einen ordinalen Wertvergleich durchführt. Das heißt, zwei Strings sind entsprechend gleich, wenn sie als "Vektoren" von "char" -Werten gleich sind, die für die Hülle empfindlich sind und Kultur nicht berücksichtigen. –

0

In Bezug auf Seite Frage:

fragment from 'Arrays in Visual Basic' on Microsoft Docs

Dim numbers = New Integer() {1, 2, 4, 8} 
Dim doubles = {1.5, 2, 9.9, 18} 

Wenn Sie Typinferenz verwenden, wird der Typ des Arrays durch die dominante Art in der Liste der Werte bestimmt, die für die geliefert hat Array-Literal. Der dominante Typ ist ein eindeutiger Typ, auf den alle anderen Typen im Array-Literal erweitert werden können. Wenn dieser eindeutige Typ nicht bestimmt werden kann, ist der dominante Typ der eindeutige Typ, auf den alle anderen Typen im Array eingrenzen können. Wenn keiner dieser eindeutigen Typen bestimmt werden kann, ist der dominante Typ Object. Wenn die Liste der Werte, die an das Array-Literal geliefert werden, beispielsweise Werte vom Typ Integer, Long und Double enthält, ist das resultierende Array vom Typ Double. Sowohl Integer als auch erweitern nur bis Double. Daher ist Double der dominierende Typ .Weitere Informationen finden Sie unter Widening and Narrowing Conversions.