2017-08-07 2 views
-2

ich Strings haben, die ich aus einem Dokument wie folgt suchen lesen:ohne Leerzeichen innerhalb eines Strings jedes Zeichen ändern Fall zu senken, abgesehen von den ersten Buchstaben

IFCPERSONANDORGANIZATION 

Mein Ziel ist es, eine neue Einheit von zu schaffen eine Klasse, die gleich heißt. Daher muss diese Zeichenfolge mit dem Klassennamen übereinstimmen. Allerdings sieht der Klassenname (was ich nicht ändern kann) wie folgt aus:

IfcPersonAndOrganization 

Gibt es eine Möglichkeit, dass die Eingabezeichenfolge ändern kann, damit es die Klasse-Namen in Bezug auf Groß- und Kleinschreibung übereinstimmt?

Leider .ToTitle funktioniert nicht für meinen Zweck, da keine Leerzeichen in meiner Eingabezeichenfolge sind. Ich habe jedoch eine Textdatei, die alle möglichen Klassennamen enthält (~ 800). So könnte ich wahrscheinlich eine Methode schreiben, die die Textdatei auf den passenden Namen überprüft und meine Eingabe entsprechend ändert. Ich befürchte, dass dies ziemlich lange dauern wird und sehr ineffizient wäre. EDIT: Die Textdatei enthält einen Klassennamen pro Zeile.

Hat jemand eine Idee, die eleganter und schneller sein könnte?

+6

_ "Ich könnte wahrscheinlich eine Methode schreiben, die die Textdatei auf den übereinstimmenden Namen überprüft und meine Eingabe entsprechend ändert" _ - ja, könnte man. _ "Ich befürchte, dass dies ziemlich lange dauern wird und sehr ineffizient sein würde" _ - Angst zu haben ist kein Grund, es nicht zu versuchen, besonders im Hinblick auf die Programmierung. Anstatt hier alle zu bitten, die Möglichkeit zu prüfen, warum tust du nicht eigentlich etwas? Sie können später eine echte Frage stellen, ob und wann Sie etwas _spezifisches_ benötigen, mit dem Sie Hilfe benötigen. –

+1

Für was es wert ist, können Sie 'StringComparer.OrdinalIgnoreCase' an einen' Dictionary '-Konstruktor übergeben, das Wörterbuch mit Identitätszuordnungen (dh wo Schlüssel und Wert übereinstimmen) für Ihre Klassennamen füllen und dann ausführen alle Namen mit Großbuchstaben durch das Wörterbuch. Ich würde erwarten, dass dies einigermaßen effizient ist. –

+0

danke für deine antwort, ich werde meine vorgeschlagene option sowie deine option geben, um zu sehen, was besser funktioniert! – FlixFix

Antwort

2

Sicher, Sie könnten Ihre Dateiinhalte in eine Liste lesen und dann prüfen, ob die Eingabezeichenfolge in der Liste enthalten ist (mit einem Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung). Wenn ja, ersetzen Sie einfach die Zeichenfolge mit dem aus der Liste:

// The input string we want to format 
var input = "IFCPERSONANDORGANIZATION"; 

// Read the file containing your class names into an array 
var filePath = @"f:\public\temp\classnames.txt"; 
var knownClassNames = File.ReadAllLines(filePath); 

// See if the list contains the name using a case-insensitive comarison. 
// If it does, `FirstOrDefault` will return a non-null value, so we assign the result 
// Otherwise, if it returns null (which is checked by `??`) we leave it as is. 
input = knownClassNames 
    .FirstOrDefault(name => name.Equals(input, StringComparison.OrdinalIgnoreCase)) 
    ?? input; 

Diese in eine einfache Funktion genommen werden kann, die man von überall anrufen könnte:

public static string CorrectClassNameCasing(string input) 
{ 
    var filePath = @"f:\public\temp\classnames.txt"; 
    var knownClassNames = File.ReadAllLines(filePath); 

    return knownClassNames 
     .FirstOrDefault(name => name.Equals(input, StringComparison.OrdinalIgnoreCase)) ?? input; 
} 

Für mein Beispiel, ich habe eine Datei, die nur den einen Klassennamen enthält, die Sie in Ihrem Beispiel erwähnt:

static void Main() 
{ 
    Console.WriteLine(CorrectClassNameCasing("IFCPERSONANDORGANIZATION")); 
    Console.WriteLine(CorrectClassNameCasing("THISDOESNOTEXIST")); 

    Console.Write("\nDone!\nPress any key to continue..."); 
    Console.ReadKey(); 
} 

Und die Ergebnisse wie folgt aussehen:

enter image description here

+0

Ich habe dich gerade wieder gewählt! Vielen Dank für die Antwort, das habe ich gerade eben geschrieben. Und es war die Methode, die ich in meiner Frage erwähnt habe, also stammt wahrscheinlich der Downvote. Ich verstehe immer noch nicht warum. Ich schätze den Aufwand und die Zeit, die Sie für die Antwort benötigt haben! Ich habe es mit meiner richtigen Liste versucht und es war ziemlich schnell, also werde ich so bleiben. Prost nochmal! – FlixFix

Verwandte Themen