Der VB-Code basiert jedoch auf der Funktion c # Teilzeichenfolge in strings.sc
Unser Mann in Bananen
Dies ist keine wirklich gute Möglichkeit, aber wenn Sie in einer Notlage sind, können Sie einen Verweis auf Microsoft.VisualBasic.dll hinzufügen und die richtige Methode verwenden. Es ist keine Erweiterungsmethode. Sie müssen es so verwenden:string endOfString = Strings.Right(wholeString, 6);
Dieser Ansatz funktioniert nicht richtig, wenn die Zeichenfolge nicht so lang ist wie die erforderliche Anzahl von Zeichen.
Stevehipwell
1
Je nachdem, was genau das OP will, kann man auch reguläre Ausdrücke darauf werfen. Wenn er nur die Nummer am Ende der Zeichenfolge haben möchte, ist dies definitiv die schmerzloseste Lösung, insbesondere wenn die Anzahl der Ziffern bei einem späteren Software-Upgrade variieren kann.
Joey
2
@Johannes Rössel - Ich bin ein großer Fan von regulären Ausdrücken (siehe meine Antworten), aber ich würde sie für eine einfache Situation wie diese niemals empfehlen. Alle Antworten, die einen Funktionsumbruch verwenden, eignen sich besser für die Codeverwaltung als ein regulärer Ausdruck. Eine Erweiterungsmethode (oder eine Standardfunktion in .NET 2.0) ist die beste Lösung.
Stevehipwell
@ Stevo3000 - Eine Lösung, die auslöst, wenn der String die falsche Länge hat, ist eine gültige Lösung. Nicht die einzige Lösung, aber dennoch.
Marc L.
3
@ James - um genauso pernickity zu sein, erwähnte nur der Titel "n Buchstaben". Die tatsächlich gestellte Frage lautete "die sechs Buchstaben ganz rechts" :)
Chris Rogers
69
Schreiben Sie eine Erweiterungsmethode, um die Right(n);Funktion auszudrücken . Die Funktion sollte sich mit null oder leeren Zeichenfolgen befassen, die eine leere Zeichenfolge zurückgeben, Zeichenfolgen, die kürzer als die maximale Länge der ursprünglichen Zeichenfolge sind, und Zeichenfolgen, die länger als die maximale Länge sind und die maximale Länge der Zeichen ganz rechts zurückgeben.
publicstaticstringRight(thisstring sValue,int iMaxLength){//Check if the value is validif(string.IsNullOrEmpty(sValue)){//Set valid empty string as string could be null
sValue =string.Empty;}elseif(sValue.Length> iMaxLength){//Make the string no longer than the max length
sValue = sValue.Substring(sValue.Length- iMaxLength, iMaxLength);}//Return the stringreturn sValue;}
Der Startindex darf auch nicht kleiner als 0 sein.
James
2
@ James - Es wird nicht so sein, wie sValue.Length > iMaxLengthbevor ein Teilstring aufgerufen wird!
Stevehipwell
3
Tolle Antwort, aber es war eine doppelte Sache, die ungarische Notation im C # -Code zu sehen.
Jerad Rose
1
@ JeradRose - Ich arbeite in einem Projekt, in dem sich die Codebasis aus einer VB3-Anwendung entwickelt hat (das meiste davon ist VB.NET), daher gibt es einige Überreste.
Stevehipwell
4
@Jalle, VB.NET hat Links, Rechts und Mittel als Funktionen der obersten Ebene sowie viele andere hilfreiche Dinge, die nicht Teil von C # sind. Ich weiß nicht warum, da viele von ihnen anständige Funktionen sind.
ingredient_15939
40
Wahrscheinlich ist es besser, eine Erweiterungsmethode zu verwenden:
Dann würde es eine NullReferenceException auslösen, genau wie wenn Sie versuchen würden, eine Methode für eine Nullzeichenfolge zu verwenden ...
James
1
str.Length - lengthkönnte negativ sein. Auch der zweite Parameter ist optional. Keine Notwendigkeit, die Länge zu übergeben.
Iheartcsharp
1
@ JMS10 könnte es sicherlich sein, aber das ist mehr die Anrufer als meine. Ja, fairerweise können Sie auch die Überschreibung verwenden, die hier nur den einzelnen Parameter verwendet.
Sollte kein Fehler auftreten, werden Nullen als leere Zeichenfolge zurückgegeben, zugeschnittene Werte oder Basiswerte zurückgegeben. Verwenden Sie es wie "testx" .Left (4) oder str.Right (12);
Wenn Sie sich über die Länge Ihrer Zeichenfolge nicht sicher sind, aber über die Anzahl der Wörter (in diesem Fall immer 2 Wörter, z. B. 'xxx yyyyyy'), sollten Sie split verwenden.
stringResult="PER 343573".Split(" ")[1];
Dies gibt immer das zweite Wort Ihrer Zeichenfolge zurück.
Ja; Nehmen wir einfach an, dass der Text von OP IMMER Leerzeichen enthält. wie in seinem Beispiel :)
Christian
1
Hei Christian :) Wir alle kennen mehr als ein paar Zeilen einer Antwort. Ich habe die Frage nur kurz beantwortet, natürlich gibt es in echtem Code noch viel mehr zu beachten.
Mahdi Tahsildari
7
Dies ist nicht genau das, wonach Sie fragen, aber wenn Sie sich nur das Beispiel ansehen, scheint es, dass Sie nach dem numerischen Abschnitt der Zeichenfolge suchen.
Wenn dies immer der Fall ist, ist die Verwendung eines regulären Ausdrucks ein guter Weg, dies zu tun.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 reguläre Ausdrücke sind für so etwas ein wenig übertrieben, besonders wenn es bereits eingebaute Methoden dafür gibt.
James
1
Ich plädiere nicht für die Verwendung dieser Methode, wenn Sie wirklich nur die letzten 6 benötigen, aber wenn Ihr Ziel darin besteht, eine Zahl (z. B. eine ID) zu extrahieren, die sich zu einem späteren Zeitpunkt auf 5 oder 7 Stellen ändern kann ist ein besserer Weg.
Chills42
1
Alte Antwort, aber +1, um die Verwendung regulärer Ausdrücke zu unterstützen. Zumal es in der .NET-String-Implementierung (noch) keine integrierten Methoden gibt, um dies zu tun @James. Andernfalls hätte diese Frage möglicherweise nie existiert.
CrazyIvan1974
@ CrazyIvan1974 nicht sicher, warum Sie mich in Ihrem Kommentar erwähnt haben
James
5
Benutze das:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Das Erraten Ihrer Anforderungen, aber der folgende reguläre Ausdruck ergibt nur 6 alphanumerische Zeichen vor dem Ende der Zeichenfolge und ansonsten keine Übereinstimmung.
string result =Regex.Match("PER 343573",@"[a-zA-Z\d]{6}$").Value;
using Microsoft.VisualBasic;...string input ="PER 343573";string output =Strings.Right(input,6);
Sie müssen keine benutzerdefinierte Erweiterungsmethode oder andere Arbeit erstellen. Das Ergebnis wird mit einer Referenz und einer einfachen Codezeile erzielt.
Als weitere Informationen hierzu wurde die Verwendung von Visual Basic-Methoden mit C # an anderer Stelle dokumentiert . Ich persönlich bin zuerst darauf gestoßen, als ich versucht habe, eine Datei zu analysieren, und fand diesen SO-Thread bei der Verwendung der Microsoft.VisualBasic.FileIO.TextFieldParserKlasse äußerst nützlich für das Parsen von CSV-Dateien.
Dies unterstützt eine beliebige Anzahl von Zeichen in der str. Der alternative Code unterstützt keine nullZeichenfolge. und der erste ist schneller und der zweite ist kompakter.
Ich bevorzuge die zweite, wenn ich die strenthaltende kurze Zeichenfolge kenne. Wenn es sich um eine lange Saite handelt, ist die erste besser geeignet.
Hier ist die Lösung, die ich verwende ... Sie überprüft, ob die Länge der Eingabezeichenfolge nicht geringer als die angeforderte Länge ist. Die oben aufgeführten Lösungen berücksichtigen dies leider nicht - was zu Abstürzen führen kann.
/// <summary>/// Gets the last x-<paramref name="amount"/> of characters from the given string./// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned./// If the given <paramref name="amount"/> is negative, an empty string will be returned./// </summary>/// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>/// <param name="amount">The amount of characters to return.</param>/// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>publicstaticstringGetLast(thisstring@string,int amount){if(@string==null){return@string;}if(amount <0){returnString.Empty;}if(amount >=@string.Length){return@string;}else{return@string.Substring(@string.Length- amount);}}
Dem Code sollte eine schriftliche Erklärung beigefügt werden, wie das Problem im OP behoben wird.
Zze
1
Nun, ich dachte, eine schriftliche Erklärung in Kommentaren wäre ausreichend, nein?
Vldmrrr
0
Ohne auf den Bitkonverter und die Bitverschiebung zurückzugreifen (muss auf Codierung achten), ist dies die schnellste Methode, die ich als Erweiterungsmethode 'Richtig' verwende.
string myString ="123456789123456789";if(myString >6){char[] cString = myString.ToCharArray();Array.Reverse(myString);Array.Resize(ref myString,6);Array.Reverse(myString);string val =newstring(myString);}
Array.Reversenimmt ein Array, keine Zeichenfolge, und if (myString.length > 6). Abgesehen von Syntaxfehlern, warum sollte dies die schnellste Methode sein? Sicherlich wäre es besser, nur Teilzeichenfolgen zu verwenden, da all diese Arrays nicht kopiert werden müssten.
1800 INFORMATION
0
Ich benutze das Min, um die negativen Situationen zu verhindern und auch Nullzeichenfolgen zu behandeln
// <summary>/// Returns a string containing a specified number of characters from the right side of a string./// </summary>publicstaticstringRight(thisstringvalue,int length){string result =value;if(value!=null)
result =value.Substring(0,Math.Min(value.Length, length));return result;}
string endOfString = Strings.Right(wholeString, 6);
Antworten:
quelle
Schreiben Sie eine Erweiterungsmethode, um die
Right(n);
Funktion auszudrücken . Die Funktion sollte sich mit null oder leeren Zeichenfolgen befassen, die eine leere Zeichenfolge zurückgeben, Zeichenfolgen, die kürzer als die maximale Länge der ursprünglichen Zeichenfolge sind, und Zeichenfolgen, die länger als die maximale Länge sind und die maximale Länge der Zeichen ganz rechts zurückgeben.quelle
sValue.Length > iMaxLength
bevor ein Teilstring aufgerufen wird!Wahrscheinlich ist es besser, eine Erweiterungsmethode zu verwenden:
Verwendung
quelle
str.Length - length
könnte negativ sein. Auch der zweite Parameter ist optional. Keine Notwendigkeit, die Länge zu übergeben.Sollte kein Fehler auftreten, werden Nullen als leere Zeichenfolge zurückgegeben, zugeschnittene Werte oder Basiswerte zurückgegeben. Verwenden Sie es wie "testx" .Left (4) oder str.Right (12);
quelle
MSDN
EDIT: zu langsam ...
quelle
Wenn Sie sich über die Länge Ihrer Zeichenfolge nicht sicher sind, aber über die Anzahl der Wörter (in diesem Fall immer 2 Wörter, z. B. 'xxx yyyyyy'), sollten Sie split verwenden.
Dies gibt immer das zweite Wort Ihrer Zeichenfolge zurück.
quelle
Dies ist nicht genau das, wonach Sie fragen, aber wenn Sie sich nur das Beispiel ansehen, scheint es, dass Sie nach dem numerischen Abschnitt der Zeichenfolge suchen.
Wenn dies immer der Fall ist, ist die Verwendung eines regulären Ausdrucks ein guter Weg, dies zu tun.
quelle
Benutze das:
quelle
Das Erraten Ihrer Anforderungen, aber der folgende reguläre Ausdruck ergibt nur 6 alphanumerische Zeichen vor dem Ende der Zeichenfolge und ansonsten keine Übereinstimmung.
quelle
Da Sie .NET verwenden, das alle in MSIL kompiliert wird , verweisen Sie einfach auf Microsoft.VisualBasic und verwenden Sie die integrierte
Strings.Right
Methode von Microsoft :Sie müssen keine benutzerdefinierte Erweiterungsmethode oder andere Arbeit erstellen. Das Ergebnis wird mit einer Referenz und einer einfachen Codezeile erzielt.
Als weitere Informationen hierzu wurde die Verwendung von Visual Basic-Methoden mit C # an anderer Stelle dokumentiert . Ich persönlich bin zuerst darauf gestoßen, als ich versucht habe, eine Datei zu analysieren, und fand diesen SO-Thread bei der Verwendung der
Microsoft.VisualBasic.FileIO.TextFieldParser
Klasse äußerst nützlich für das Parsen von CSV-Dateien.quelle
Dies unterstützt eine beliebige Anzahl von Zeichen in der
str
. Der alternative Code unterstützt keinenull
Zeichenfolge. und der erste ist schneller und der zweite ist kompakter.Ich bevorzuge die zweite, wenn ich die
str
enthaltende kurze Zeichenfolge kenne. Wenn es sich um eine lange Saite handelt, ist die erste besser geeignet.z.B
oder
quelle
Benutze das:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
quelle
Eine andere Lösung, die möglicherweise nicht erwähnt wird
quelle
Null sichere Methoden:
Zeichenfolgen, die kürzer als die maximale Länge sind und die ursprüngliche Zeichenfolge zurückgeben
String Right Extension-Methode
String Left Extension-Methode
quelle
Hier ist die Lösung, die ich verwende ... Sie überprüft, ob die Länge der Eingabezeichenfolge nicht geringer als die angeforderte Länge ist. Die oben aufgeführten Lösungen berücksichtigen dies leider nicht - was zu Abstürzen führen kann.
quelle
Dies ist die Methode, die ich verwende: Ich mag es, die Dinge einfach zu halten.
quelle
Nur ein Gedanke:
quelle
quelle
Ohne auf den Bitkonverter und die Bitverschiebung zurückzugreifen (muss auf Codierung achten), ist dies die schnellste Methode, die ich als Erweiterungsmethode 'Richtig' verwende.
quelle
Array.Reverse
nimmt ein Array, keine Zeichenfolge, undif (myString.length > 6)
. Abgesehen von Syntaxfehlern, warum sollte dies die schnellste Methode sein? Sicherlich wäre es besser, nur Teilzeichenfolgen zu verwenden, da all diese Arrays nicht kopiert werden müssten.Ich benutze das Min, um die negativen Situationen zu verhindern und auch Nullzeichenfolgen zu behandeln
quelle
Ausgabe ist "Word"
quelle