none
LINQ ? Suche ROW aus Tabelle 1 in Tabelle 2 RRS feed

  • Frage

  • Hi,

    suche nach einer Routine, die mir eine Zeileaus Tabelle 1 (10 Spalten) in der Tabelle 2 sucht (11 Spalten). Die SpaltenNamen sind immer unterschiedlich, aber in beiden tabellen gleich enthalten. Nur Tabelle 2 besitzt eine zusätzlich Spalte "_Id".

    Habe etliches im Internet gefunden, aber nichts was irgendwie annähernd passt.


    Gruß Hipp

    Freitag, 19. August 2016 14:23

Antworten

  • Hi,'
    auch da kannst Du durch die erste Tabelle in der äßeren Schleife iterieren und dann in einer zweiten Schleife DataRow für DataRow in der zweiten Tabelle prüfen und in einer dritten eingebetteten Schleife Feld für Feld prüfen.

    Nachfolgend eine Demo:

    using System;
    using System.Data;
    
    namespace ConsoleApplication1CS
    {
      class Program24
      {
        static void Main(string[] args)
        {
          try
          {
            (new Demo()).Execute();
          }
          catch (Exception ex)
          {
            var ex1 = ex;
            string msg = "";
            while (ex1 != null)
            {
              msg += ex1.Message + Environment.NewLine;
              ex1 = ex1.InnerException;
            }
            Console.WriteLine(msg);
          }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            // tab1
            DataTable tab1 = new DataTable();
            tab1.Columns.Add("Spalte1", typeof(string));
            tab1.Columns.Add("Spalte3", typeof(string));
            tab1.Columns.Add("Spalte2", typeof(string));
            // tab2
            DataTable tab2 = new DataTable();
            tab2.Columns.Add("Spalte1", typeof(string));
            tab2.Columns.Add("Spalte2", typeof(string));
            tab2.Columns.Add("Spalte3", typeof(string));
            tab2.Columns.Add("ID", typeof(int));
            // Sätze in tab1
            tab1.Rows.Add("a", "b", "c");
            tab1.Rows.Add("b", "c", "d");
            tab1.Rows.Add("c", "d", "e");
            // Sätze in tab2
            tab2.Rows.Add("a", "b", "c", 1);
            tab2.Rows.Add("b", "c", "d", 2);
            tab2.Rows.Add("b", "d", "c", 3);
            tab2.Rows.Add("c", "d", "e", 4);
            // Vorbereitung zur schenleren Abfrage der Werte
            int[] map = new int[tab1.Columns.Count];
            for (int i = 0; i < tab1.Columns.Count; i++)
              for (int k = 0; k < tab2.Columns.Count; k++)
                if (tab1.Columns[i].ColumnName == tab2.Columns[k].ColumnName)
                  map[i] = k;
            // Prüfung
            for (int i = 0; i < tab1.Rows.Count; i++)
              for (int k = 0; k < tab2.Rows.Count; k++)
              {
                bool sw = true;
                for (int l = 0; l < tab1.Columns.Count; l++)
                  sw = tab1.Rows[i].ItemArray[l].ToString() == tab2.Rows[k].ItemArray[map[l]].ToString() && sw;
                if (sw) Console.WriteLine($"gefunden in tab2, ID: {tab2.Rows[k]["ID"]}");
              }
          }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.


    Freitag, 19. August 2016 18:24

Alle Antworten

  • Hi,
    von welchem Typ ist bei Dir eine Tabelle? Wenn es Array's sind, dann kannst Du einfach eine Schleife in einer Schleife ausführen und feldweise vergleichen.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.

    Freitag, 19. August 2016 14:46
  • Hi,

    vom Typ DataTable.


    Gruß Hipp

    Freitag, 19. August 2016 15:00
  • Hi,'
    auch da kannst Du durch die erste Tabelle in der äßeren Schleife iterieren und dann in einer zweiten Schleife DataRow für DataRow in der zweiten Tabelle prüfen und in einer dritten eingebetteten Schleife Feld für Feld prüfen.

    Nachfolgend eine Demo:

    using System;
    using System.Data;
    
    namespace ConsoleApplication1CS
    {
      class Program24
      {
        static void Main(string[] args)
        {
          try
          {
            (new Demo()).Execute();
          }
          catch (Exception ex)
          {
            var ex1 = ex;
            string msg = "";
            while (ex1 != null)
            {
              msg += ex1.Message + Environment.NewLine;
              ex1 = ex1.InnerException;
            }
            Console.WriteLine(msg);
          }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            // tab1
            DataTable tab1 = new DataTable();
            tab1.Columns.Add("Spalte1", typeof(string));
            tab1.Columns.Add("Spalte3", typeof(string));
            tab1.Columns.Add("Spalte2", typeof(string));
            // tab2
            DataTable tab2 = new DataTable();
            tab2.Columns.Add("Spalte1", typeof(string));
            tab2.Columns.Add("Spalte2", typeof(string));
            tab2.Columns.Add("Spalte3", typeof(string));
            tab2.Columns.Add("ID", typeof(int));
            // Sätze in tab1
            tab1.Rows.Add("a", "b", "c");
            tab1.Rows.Add("b", "c", "d");
            tab1.Rows.Add("c", "d", "e");
            // Sätze in tab2
            tab2.Rows.Add("a", "b", "c", 1);
            tab2.Rows.Add("b", "c", "d", 2);
            tab2.Rows.Add("b", "d", "c", 3);
            tab2.Rows.Add("c", "d", "e", 4);
            // Vorbereitung zur schenleren Abfrage der Werte
            int[] map = new int[tab1.Columns.Count];
            for (int i = 0; i < tab1.Columns.Count; i++)
              for (int k = 0; k < tab2.Columns.Count; k++)
                if (tab1.Columns[i].ColumnName == tab2.Columns[k].ColumnName)
                  map[i] = k;
            // Prüfung
            for (int i = 0; i < tab1.Rows.Count; i++)
              for (int k = 0; k < tab2.Rows.Count; k++)
              {
                bool sw = true;
                for (int l = 0; l < tab1.Columns.Count; l++)
                  sw = tab1.Rows[i].ItemArray[l].ToString() == tab2.Rows[k].ItemArray[map[l]].ToString() && sw;
                if (sw) Console.WriteLine($"gefunden in tab2, ID: {tab2.Rows[k]["ID"]}");
              }
          }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen! Leben retten!
    Wir essen Opa.
    Wir essen, Opa.


    Freitag, 19. August 2016 18:24