Ich schreibe ein Framework, das eine Verbindung zu vielen verschiedenen Datenquellentypen herstellt und Werte aus diesen Quellen zurückgibt. Die einfachen sind SQL, Access und Oracle. Die härteren sind Sharepoint, CSV.
Wenn ich Werte aus textbasierten Quellen zurücksende, möchte ich den Datentyp der Daten bestimmen.
Da eine CSV nur aus Text besteht, müssen keine Metadaten abgefragt werden. Ich müsste die Daten irgendwie analysieren, um den Datentyp zu bestimmen.
Beispiel:
Liste von "wahr", "wahr", "falsch", "falsch" wäre boolean Liste von "1", "0", "1", "0" wäre boolean Liste von "1", "4", "-10", "500" wäre eine ganze Zahl Liste von "15.2", "2015.5896", "1.0245", "500" wäre doppelt
Liste von "2001/01/01", "2010/05/29 12:00", "1989/12/25 10:34:21" wäre datetime
Es basiert auf Ссылка
%Vor%Bearbeiten: Ich muss nur Folgendes berücksichtigen:
%Vor%Können Sie eine mögliche Verbesserung der Priorität sehen?
Da Dimi ein Kopfgeld zahlt und eine "modernere" Lösung braucht, werde ich versuchen, eine zu liefern. Erstens, was brauchen wir von einer vernünftigen Klasse, die Strings in verschiedene Sachen umwandelt?
Angemessenes Verhalten bei grundlegenden Typen.
Respektieren Sie Kulturinformationen, besonders wenn Sie Zahlen und Daten konvertieren.
Möglichkeit, die Logik bei Bedarf mit benutzerdefinierten Konvertern zu erweitern.
Als Bonus vermeiden Sie lange "if" -Ketten, da sie recht fehleranfällig sind.
%Vor%Verwenden Sie so:
%Vor%Wäre es einfacher, es in einem generischen Datentyp mit .ToInt16 (), .ToInt32 (), .ToBool () usw. zu speichern? Wenn Sie eine App schreiben, die int erwartet und es boolesch wird, wird es scheitern, also wäre es besser, den Programmierer explizit zum erwarteten Datentyp konvertieren zu lassen.
Das Problem mit Ihrem Ansatz besteht darin, dass Sie nicht wissen, ob eine Zeile, die 0 als erstes Element enthält, -100000 als Elementnummer 100 enthält. Dies bedeutet, dass Sie keine erfolgreiche Konvertierung durchführen können, bis alle Zeilen TryParsed sind all die verschiedenen Datentypen. Sehr teure Operation!
Wenn überhaupt, würde ich vorkompilierte reguläre Ausdrücke und / oder benutzerdefinierte Logik verwenden, um die Daten zu verarbeiten. Zum Beispiel Iteration aller Zeilen, um die höchste / niedrigste Zahl, das Auftreten von Strings usw. zu finden.
Es kann nicht der beste Ansatz sein, mit den schmalsten Typen zu beginnen und auf die breiteste zu arbeiten. Wenn ich etwas über die Daten wüsste, würde ich mit dem am häufigsten vorkommenden Typ beginnen und auf das Geringste hinarbeiten. Wenn ich das nicht wüsste, würde ich vielleicht nachforschen oder nicht, um eine Vorstellung davon zu bekommen, was das statistisch sein könnte, wenn möglich. Sonst würde ich nur meine beste Schätzung machen. Warum früh auf Bit oder Datetime testen, wenn Sie nur einmal alle 10.000 Datensätze erwarten?