Wie kann ich IEnumerableT automatisch in eine CSV-Datei umwandeln?

9

Ich versuche, ein Benutzersteuerelement zu erstellen, das jede generische Liste akzeptiert, damit ich es durchlaufen und einen CSV-Export erstellen kann. Ist es möglich, eine öffentliche Eigenschaft anzugeben, die einen beliebigen Typ annehmen kann? (d. h. List<Product> , List<Customer> , usw.) Wenn ja, wie?

%Vor%

Hier ist, was ich habe so weit wie die Utility-Methoden, die ich habe:

%Vor%     
Rod 06.06.2012, 14:05
quelle

6 Antworten

15

Wenn Sie aus einer Liste von Objekten "CSV-Export erstellen" möchten, sollten Sie die Spalten mithilfe der Reflektion berechnen.

Letztes Update 12. Februar 2016:

Es macht mehr Sinn, das Trennzeichen standardmäßig auf ein Komma zu setzen, und es ist sinnvoll, die Ausgabe einer initialen Kopfzeile optional zu machen. Es unterstützt jetzt auch Felder und einfache Eigenschaften durch Verwendung von Concat :

%Vor%

Sie verwenden es dann für Kommas mit Trennzeichen:

%Vor%

oder für einen anderen Begrenzer (z. B. TAB):

%Vor%

Praktische Beispiele

Schreibe eine Liste in eine kommagetrennte CSV-Datei

%Vor%

oder schreiben Sie es tabulatorgetrennt

%Vor%

Wenn Sie komplexe Felder / Eigenschaften haben, müssen Sie sie aus den Auswahlklauseln herausfiltern.

Vorherige Aktualisierungen

Abschließende Gedanken zuerst (damit es nicht verpasst wird):

Wenn Sie eine generische Lösung bevorzugen (dies stellt sicher, dass die Objekte vom selben Typ sind):

%Vor%

Dieser enthält sowohl öffentliche Felder als auch öffentliche Eigenschaften.

Im Allgemeinen brauchen Sie bei der Reflektion nicht den Typ der Objekte in der Liste (Sie müssen nur annehmen, dass sie alle vom selben Typ sind).

Sie könnten einfach verwenden:

%Vor%

Der grundlegende Prozess für das, was Sie tun möchten, lautet etwa:

  • Bezieht den Typ vom ersten Objekt in der Liste (z. B. GetType() ).
  • Iteriere die Eigenschaften dieses Typs.
  • Schreiben Sie den CSV-Header aus, z. basierend auf den Namen der Eigenschaft (oder eines Attributs).
  • Für jedes Element in der Liste ...
    • Iteriere die Eigenschaften dieses Typs
    • Erhalte den Wert für jede Eigenschaft (als Objekt)
    • Schreiben Sie die ToString () - Version des Objekts mit Trennzeichen
    • aus

Sie können den gleichen Algorithmus verwenden, um ein 2D-Array zu generieren (d. h. wenn das Steuerelement z. B. in tabellarischer / Rasterform etwas wie CSV anzeigen soll).

Das einzige Problem, das Sie möglicherweise haben, ist die Konvertierung von IEnumerables / Listen bestimmter Typen in IEnumerable. Verwenden Sie in diesen Fällen .Cast<object> für Ihr spezifisches typisiertes Enumerable.

Aktualisierung:

Sie verwenden Code von Ссылка

Sie müssen folgende Änderung an seinem Code vornehmen:

%Vor%

Wenn Sie eine leere Liste unterstützen wollen, fügen Sie einen zweiten Parameter hinzu (zB Type type ), der den Typ des erwarteten Objekts darstellt, und verwenden Sie diesen anstelle von list.First (). GetType () .

Hinweis: Ich sehe nirgendwo anders in seinem Code, wo T referenziert wird, aber wenn ich es verpasst habe, findet der Compiler es für dich:)

Update (vollständiger & amp; vereinfachter CSV-Generator):

%Vor%

Dies hat den Vorteil eines geringen Speicheraufwands, da es Ergebnisse liefert, wenn sie auftreten, anstatt eine massive Zeichenfolge zu erstellen. Sie können es verwenden wie:

%Vor%

Ich bevorzuge die generische Lösung in der Praxis, also habe ich diese zuerst platziert.

    
Gone Coding 06.06.2012, 14:34
quelle
2

Sie müssten so etwas tun:

%Vor%

Aus einer C # -Ansicht ist das vollkommen in Ordnung. Wenn Sie jedoch Ihr Benutzersteuerelement in ASPX Markup deklarieren möchten, kann ein Benutzersteuerelement keine Typparameter auf Klassenebene enthalten. Dies ist nicht möglich:

%Vor%

Wenn Ihr Benutzersteuerelement jetzt nur im Code-Behind und nicht im Markup erstellt wird, ist das in Ordnung:

%Vor%

Wenn Sie Ihr Benutzersteuerelement in ASPX-Markup deklarieren möchten / möchten, sollten Sie am besten eine IEnumerable<object> -Eigenschaft erstellen.

    
vcsjones 06.06.2012 14:14
quelle
1

Ich habe eine schöne Lösung von hier

gefunden %Vor%

Offenbar behandelt es Kommas und doppelte Anführungszeichen. Ich werde es benutzen.

    
Aximili 14.02.2013 02:17
quelle
0

Um generische Eigenschaften zu haben, muss die Klasse auch generisch sein:

%Vor%     
Vishal Mistry 06.06.2012 14:10
quelle
0

Da IEnumerable eine Basisklasse von IEnumerable<T> ist, könnte jede korrekt geschriebene Klasse IEnumerable<T> an eine Eigenschaft vom Typ IEnumerable übergeben werden. Da es so klingt, als ob Sie nur an dem "ToString ()" -Teil und nicht am "T-Teil" interessiert sind, sollte IEnumerable gut funktionieren.

    
jyoung 06.06.2012 14:29
quelle
0

Das funktioniert für mich.

%Vor%     
Carlos Toledo 17.01.2017 18:39
quelle

Tags und Links