Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 145
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Eine allgemeine Liste (IEnumerable) in ein Array umwandeln


Autor: Marcel Kloubert
Sprache: C#
Bewertung: 1,8
(1 Bewertung)
Anzahl der Aufrufe: 5980
  
Kick it on dotnet-kicks.de  

Beschreibung:

Eine Extension-Methode, die jedes Objekt vom Typ System.Collections.IEnumerable (Arrays, Listen, etc.) in ein Array umwandelt.
Jedes Objekt dieses Typs wird nun um die untere generische Methode erweitert, sofern diese für das Objekt "sichtbar" ist.

Beispiel:
System.Collections.Generic.List<int> zahlen = new System.Collections.Generic.List<int>();

for (int i = 0; i < 1000; i++)
{
zahlen.Add(i * 2);
}

System.Collections.IEnumerable list = zahlen;

/// Das Objekt 'list' wird nur als 'System.Collections.IEnumerable'-Objekt
/// angesehen, d.h. es gibt KEINE Methode ToArray(), wie in
/// System.Collections.Generic.List<T> definiert!
int[] intArray = list.ToArray<int>();


Abgelegt unter: generic, type, generischer, convert, konvertieren, ienumerable, array, .



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections;
using System.Collections.Generic;

namespace MarcelJKloubert
{
    public static class Tools
    {
        #region Methoden
        /// <summary>
        /// Konvertiert eine allgemeine Liste in ein Array aus Objekten
        /// </summary>
        /// <param name="list">Liste</param>
        /// <returns>Liste als Array</returns>        
        public static object[] ToArray(this IEnumerable list)
        {
            return ToArray<object>(list);
        }
        
        /// <summary>
        /// Konvertiert eine allgemeine Liste in ein Array eines bestimmten Typs
        /// </summary>
        /// <typeparam name="T">Zieltyp des Rückgabearrays</typeparam>
        /// <param name="list">Liste</param>
        /// <returns>Liste als Array</returns>        
        public static T[] ToArray<T>(this IEnumerable list)
        {
            if (list is T[])
            {
                // muss nicht umgewandelt werden
                return (T[])list;
            }

            // neue Liste erzeugen
            List<T> result = new List<T>();
            {
                foreach (object item in list)
                {
                    result.Add((T)item);
                }
            }
            return result.ToArray();
        }
        #endregion
    }
}

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Rainer Hilmer schrieb am:  22.11.2009 01:07:00

Warum hast du nicht die generische Form von IEnumerable genommen? Die bietet auch ToArray. Ausserdem kann ich keinen Sinn darin erkennen, wenn man einen Referenztyp (zahlen) an einen anderen (list) übergibt. Beide zeigen auf den gleichen Heap. Änderst du in einem etwas, passiert das Gleiche in dem anderen.
Christopher Kk schrieb am:  22.11.2009 10:55:21

Hmm ganz ehrlich find ich das nicht so gut. Alleine was bei der ersten Version für Boxing Operationen passieren. Und warum sollte ich eine nichtgenerische Version einer generischen Version vorziehen wo ich jegliche Typsicherheit habe?
Marcel Kloubert schrieb am:  22.11.2009 16:42:51

@Rainer: Das stimmt nicht ganz: Ein allgemeines IEnumerable-Objekt hat ausschliesslich die Methode GetEnumerator(), das ein IEnumerator-Objekt zurückgibt womit du nur die Möglichkeiten hast, gemäß Iterator-Entwurfsmuster, an den Anfang zu springen und zum nächsten Objekt zu gehen. Sonst hätten Collections, wie ToolStripCollection bereits eine ToArray()-Methode. Du verwechselst das vielleicht mit List<Tgt; oder ArrayList.

@Christopher: Es kann aus irgendwelchen Gründen immer mal vorkommen, dass Du ein Objekt bekommst das nur IEnumerable ist bzw. Du möchtest alle ToolStripCollection-Elemente als Array haben ohne selbst die Liste mit einem for oder foreach zu durchlaufen.

Gut, vielleicht ist der Beispielcode nicht der anschaulichste ;-)
Marcel Kloubert schrieb am:  22.11.2009 16:45:09

Korrektur:

es sollte heissen: "... Du möchtest alle ToolStripCollection-Elemente als Array haben ohne selbst die Liste mit einem foreach zu durchlaufen. ..."
Christopher Kk schrieb am:  22.11.2009 17:19:05

Gut ok das kann ja sein. Aber mir ist noch nicht so klar gewurden was ich für vorteile davon trage etwas in ein Array umzuwandeln wenn ich es doch als Collection vorliegen habe? Der Fall tritt ehrlich gesagt bei mir nicht so oft ein das ich das machen muss, eher andersum.
Rainer Hilmer schrieb am:  23.11.2009 10:30:57

@Marcel Kloubert: http://msdn.microsoft.com/en-us/library/bb298736.aspx


Diese Snippets könnten für Sie interessant sein:
[C#] Generische Between Methode
[C#] Generische Liste per Reflection erzeugen
[C#] Generische Extension zum Auslesen eines Klassen-Attributes
[C#] Filtern mit dem Blacklist - Whitelist Verfahren
[C#] Generische Klasse die Objekte für eine ComboBox kapselt
[C#] generische zip funktion
[C#] Generisch XML De-/ Serialisieren
[C#] Singleton Basisklasse (thread-safe, generic, Lazy Creation)
[C#] Add Key-Value return old Value
[C#] Generische Event Args -> EventArgs
[C#] WatchedList
[C#] Typ der Elemente in einem Array herausfinden
[C#] CellMatrix
[C#] Prüfen, ob Teil des .NET Frameworks
[C#] Zugriff auf Variablen/Funktionen einer unbekannten Klasse
[C#] Prüfen ob ein Text eine Zahl ist
[C#] byte[] -> base64 und base64 -> byte[]
[C#] MultiConverter (DEZ-HEX-OKT-BIN)
[C#] Generischer Converter für CSV Dateien
[VB.NET] Convert DataGridViewRow nach DataRow
[VB.NET] Convert DataGridViewRow nach Objekt-Typ
[C#] Integer nach Excel Spalten Bezeichnung
[C#] Excel Spalten Bezeichnung nach Integer
[VB.NET] String in Byte Array und zurück wandeln
[VB.NET] Listen, Arrays, Strings konvertieren
[C#] Text2Bitmap (String in Bild umwandeln)
[C#] Double in String umwandeln (mit InvariantCulture)
[C#] String in Double umwandeln (mit InvariantCulture)
[C#] UrlDecode
[C#] Export Office Dokument nach PDF / XPS
[C#] Another Bin-Watch (Console)
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren
[C#] string in Hex wandeln
[C#] Word: Word-Dokument automatisch in HTML umwandeln
[C#] Image in IPictureDisp umwandeln
[VB.NET] Rows eines DataGridView in ein String-Array konvertieren
[C#] List string zu List int konvertieren
[C#] Liste mit int array zu Liste mit string array
[C#] ArrayList zu string array konvertieren
[C#] long in ein byte-Array kopieren
[C#] simple generic pipeline
[C#] Controls gleichen Typs von einem Container in Winform holen
[C#] Duplikate aus einer IEnumerable entfernen
[C#] Enumerator as a parameter of a method
[C#] Stream, der mit foreach() durchlaufen werden kann
[C#] Zufälliger Eintrag aus einer Liste (Extension Method)
[C#] Implode und Trim für String-Enumerationen (Extension Method)
[C#] IsNull and IsNullOrEmpty Extension-Methods become Lazy
[VB.NET] Doppelte Einträge aus Arraylist löschen
[C#] Convert an ArrayList into an array
[C#] String in Byte Array und zurück wandeln
[C#] Bitmap in Byte Array schreiben
[C#] Arraylist in Textdatei schreiben
[C#] Wandelt ein Bytearray in einen Binärstring
[C#] BubbleSort Verfahren / Algorithmus
[VB.NET] Dateien nach Datum sortieren
[VB.NET] Doppelte Arrayeinträge mit linearem Aufwand entfernen
[VB.NET] Textdatei lesen und schreiben (String, StringArray, etc...)
[VB.NET] List all controls by using the name of the controls
[C#] Datei einlesen und als ArrayList jede Zeile zurückliefern
[C#] Byte-Array in Struktur kopieren
[C#] Array zur Laufzeit erweitern
[C#] Kleine Array-Erweiterung
[VB.NET] Doppelte Eintäge löschen
[C#] SortingHelper - MoveUpInList & MoveDownInList

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.