Announcement

Collapse
No announcement yet.

List<> mehrdimensional?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • List<> mehrdimensional?

    Hallo

    Ich muss zur Weiterverarbeitung Daten in einer Liste speichern. Es ist jeweils ein String und ein dazugehörendes Datum, welches ich zu einem späteren Zeitpunkt wieder benötige. Kann ich in einem List<string> mehrere Daten speichern oder kann ich da nur entweder den String oder das Datum (kann auch in einen String umgewandelt werden) speichern?

    Danke und Gruss
    Roland

  • #2
    Hallo,

    wenn ein "Datensatz" aus mehreren Spalten besteht, wäre List<string> die schlechteste Wahl. Im Gegensatz dazu hat ein typisiertes DataSet (das als "In-Memory-Table" genutzt wird) die folgenden Vorteile:
    • Das Programm greift typisiert (d.h. mit IntelliSense-Unterstützung) auf die Spalten der gespeicherten Datensätze zu.
    • Die von der DataTable-Klasse bereitgestellte Auswertungsmethoden können genutzt werden.
    • Wenn später Auswertungen der gespeicherten Daten notwendig werden, ist der Speicherverbrauch geringer als bei einer generischen Liste, die mehrere Spalten als einen String verketten muss (siehe Abbildung). Die Select-Methode der DataTable-Klasse ist zudem um den Faktor 5 schneller als eine Extrahierung von Einzelwerten aus der verketteten Zeichenfolge einer List-Instanz.

    In der angehängten Abbildung wird der vom Profiler aus Visual Studio 2005 Team Edition for Software Developers gemessene Speicherbedarf für das Anlegen und Auswerten von 5000 Datensätzen mit jeweils 3 Spalten gegenübergestellt. Es werden 2 Methoden gemessen, in denen die gleichen Aufgaben unterschiedlich abgearbeitet werden:

    Variante List<string>:
    Code:
            private void DoWorkList()
            {
                aSW.Reset();
                aSW.Start();
                List<String> aLS = new List<string>();
                for (int i = 1; i <= iRowCount; i++)
                {
                    if (i % 25 == 1)
                        aLS.Add(String.Format("{0};03617398123;a", i));
                    else
                        aLS.Add(String.Format("{0};03617398123;b", i));
                }
                aSW.Stop();
                listBox1.Items.Add(String.Format("Fülle {0} Einträge: {1} ms",
                    iRowCount, (int)aSW.ElapsedMilliseconds));
                aSW.Reset();
                aSW.Start();
                List<string[]> fList1 = new List<string[]>();
                List<string[]> fList2 = new List<string[]>();
                foreach (string element in aLS)
                {
                    string errorText = String.Empty;
                    string[] felder = element.Split(new Char[] { ';' });
                    if (IsEntsperrung(felder))
                        fList1.Add(felder);
                    else
                        fList2.Add(felder);
                }
                aSW.Stop();
                listBox1.Items.Add(String.Format("Aufteilen ({0}/{1}): {2} ms",
                    fList1.Count, fList2.Count, (int)aSW.ElapsedMilliseconds));
            }
    Variante typisiertes DataSet

    Code:
           private void DoWorkTypedDS()
            {
                aSW.Reset();
                aSW.Start();
                DataSet1.DataTable1DataTable aDSDT = new DataSet1.DataTable1DataTable();
                aDSDT.MinimumCapacity = iRowCount;
                for (int i = 1; i <= iRowCount; i++)
                {
                    if (i % 25 == 1)
                        aDSDT.AddDataTable1Row(i, "03617398123", "a");
                    else
                        aDSDT.AddDataTable1Row(i, "03617398123", "b");
                }
                aSW.Stop();
                listBox3.Items.Add(String.Format("Fülle {0} Einträge: {1} ms",
                    iRowCount, (int)aSW.ElapsedMilliseconds));
                aSW.Reset();
                aSW.Start();
                DataRow[] aSelectArray1 = aDSDT.Select("art='a'");
                DataRow[] aSelectArray2 = aDSDT.Select("art='b'");
                aSW.Stop();
                listBox3.Items.Add(String.Format("Aufteilen ({0}/{1}): {2} ms",
                    aSelectArray1.Length, aSelectArray2.Length, (int)aSW.ElapsedMilliseconds));
            }
    Wie die 2. Abbildung zeigt, ist primär die Split-Methode (d.h. das bei der Auswertung notwendige Aufteilen der Einzelwerte aus der String-Zeichenkette) für die Probleme zuständig.
    Attached Files
    Zuletzt editiert von Andreas Kosch; 27.12.2007, 08:13.

    Comment


    • #3
      Hallo,

      Andreas' Erläuterungen sind zwar (wie immer) völlig richtig, aber in der speziellen Situation überdimensioniert. Bei zwei Werten pro Eintrag bietet sich doch wohl ein Dictionary<string, DateTime> an (natürlich unter der Voraussetzung, dass die Strings eindeutig sind).

      Gruß Jürgen

      Comment


      • #4
        Hallo Roland,

        Du könntest den String und das Datum auch in eine Klasse packen:

        Code:
        class MyClass
        {
          public string s;
          public DateTime d;
        }
        und dann diese Objekte in einer Liste vom Typ List<MyClass> speichern.

        HTH
        Peter

        Comment

        Working...
        X