none
List<> aus den Einträgen einer anderen List erstellen RRS feed

  • Frage

  • Hallo zusammen,

    häng wieder Mal fest:

    Ich habe eine BindingList mit mehreren Feldern (aus einer Struktur). Diese wird in einer Funktion mit wechselnden Daten gefüllt. Nun benötige ich den Inhalt von zwei Feldern für eine neue Liste. Die Zeilen des einen Feldes sollen die Felder der neuen Liste sein. Mit den Daten des zweiten Feld soll eine Zeile Inhalt erstellt werden.

    Konkret:

    Liste 1:

    (..., Feldname, Inhalt, ...)

    Nachname, Mustermann

    Vorname, Max

    sollen werden zu Liste 2:

    (Nachname, Vorname)

    Mustermann, Max

    Wie würde Ihr das machen? Ziel der 2. Liste ist es, eine XML-Datei für den Export zu erstellen.

    Besten Dank und freundliche Grüße

    Markus

    Montag, 19. Februar 2018 14:21

Antworten

  • Hi Markus,
    wenn klar ist, wann ein Wechsel zum nächsten Datenobjekt erkannt wird, ist das ganz einfach. In der folgenden Konsolen-Demo habe ich mal den Wechsel mit dem nächsten Nachnamen ermittelt.

    using System;
    using System.Collections.Generic;
    using System.Xml.Linq;
    
    namespace ConsoleApp1
    {
      class Program39
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            // Ausgangsliste
            List<Data1> liste1 = new List<Data1>()
            {
              new Data1() {Feldname= "Nachname", Inhalt= "Mustermann" },
              new Data1() {Feldname= "Vorname", Inhalt= "Max" },
              new Data1() {Feldname= "Nachname", Inhalt= "Lehmann" },
              new Data1() {Feldname= "Vorname", Inhalt= "Klaus" },
              new Data1() {Feldname= "Nachname", Inhalt= "Müller" },
              new Data1() {Feldname= "Vorname", Inhalt= "Hans" }
            };
            // Ergebnis-Objekt
            XElement result = new XElement("root");
            // einzufügendes Datenobjekt
            XElement data = null;
            // Azúsgangsliste durchlaufen
            foreach (Data1 item in liste1)
            {
              // neues Datenobjekt
              if (item.Feldname=="Nachname")
              {
                // letztes Datenobjekt anhängen
                if (data != null) result.Add(data);
                // nächste Datenobjekt vorbereiten
                data = new XElement("Data");
              }
              // aktuelles Datenobjekt füllen
              data.Add(new XElement(item.Feldname) { Value = item.Inhalt });
            }
            // letztes Datenopbjekt nicht vergessen!
            if (data != null) result.Add(data);
            // Kontrollanzeige
            Console.WriteLine(result.ToString());
          }
        }
        internal class Data1
        {
          internal string Feldname { get; set; }
          internal string Inhalt { get; set; }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Maks M Dienstag, 20. Februar 2018 20:52
    Montag, 19. Februar 2018 14:51

Alle Antworten

  • Hi Markus,
    wenn klar ist, wann ein Wechsel zum nächsten Datenobjekt erkannt wird, ist das ganz einfach. In der folgenden Konsolen-Demo habe ich mal den Wechsel mit dem nächsten Nachnamen ermittelt.

    using System;
    using System.Collections.Generic;
    using System.Xml.Linq;
    
    namespace ConsoleApp1
    {
      class Program39
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            // Ausgangsliste
            List<Data1> liste1 = new List<Data1>()
            {
              new Data1() {Feldname= "Nachname", Inhalt= "Mustermann" },
              new Data1() {Feldname= "Vorname", Inhalt= "Max" },
              new Data1() {Feldname= "Nachname", Inhalt= "Lehmann" },
              new Data1() {Feldname= "Vorname", Inhalt= "Klaus" },
              new Data1() {Feldname= "Nachname", Inhalt= "Müller" },
              new Data1() {Feldname= "Vorname", Inhalt= "Hans" }
            };
            // Ergebnis-Objekt
            XElement result = new XElement("root");
            // einzufügendes Datenobjekt
            XElement data = null;
            // Azúsgangsliste durchlaufen
            foreach (Data1 item in liste1)
            {
              // neues Datenobjekt
              if (item.Feldname=="Nachname")
              {
                // letztes Datenobjekt anhängen
                if (data != null) result.Add(data);
                // nächste Datenobjekt vorbereiten
                data = new XElement("Data");
              }
              // aktuelles Datenobjekt füllen
              data.Add(new XElement(item.Feldname) { Value = item.Inhalt });
            }
            // letztes Datenopbjekt nicht vergessen!
            if (data != null) result.Add(data);
            // Kontrollanzeige
            Console.WriteLine(result.ToString());
          }
        }
        internal class Data1
        {
          internal string Feldname { get; set; }
          internal string Inhalt { get; set; }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Maks M Dienstag, 20. Februar 2018 20:52
    Montag, 19. Februar 2018 14:51
  • Hallo Peter,

    wunderbar, das ist es. Hab es so modifiziert, dass nicht jedes mal ein neues Datenobjekt angelegt wird, sondern alle Felder in eines gepackt werden. Klappt einwandfrei, besten Dank!

    Beste Grüße

    Markus Mayer

    Dienstag, 20. Februar 2018 20:55