2016-07-27 31 views
0

Ich versuche, gemeinsame Zeilen aus zwei Datentabellen zu erhalten. Eine Überschneidungsoperation über diese beiden eliminiert jedoch die doppelten Zeilen (Duplikate innerhalb derselben Datentabelle) und gibt nur eindeutige Zeilen zurück.Doppelte Zeilen als Ergebnis der aufzählbaren Schnittmenge beibehalten

Wie kann ich die doppelten Zeilen im Ergebnis beibehalten? Hier ist mein Code:

class Program 
{ 
    public static void Main(string[] args) 
    { 
     var a=ImportExcelToDataTable(@"D:\Dummy\Test\CD24.xlsx"); 
     var b = ImportExcelToDataTable(@"D:\Dummy\Test\CD25.xlsx"); 

     CustomDataRowComparer myDRComparer = new CustomDataRowComparer(); 
     try 
     { 
      var comonData = a.AsEnumerable().Intersect(b.AsEnumerable(), myDRComparer).CopyToDataTable(); 

        } 

     catch (Exception ex) 
     { 
      ex.ToString(); 
     } 

    } 

} 

public class CustomDataRowComparer : IEqualityComparer<DataRow> 
{ 
    public bool Equals(DataRow x, DataRow y) 
    { 

     for (int i = 0; i < 6; i++) 
     { 
      if (i == 4) 
      { 
       //ignore 
      } 
      else 
      { 
       if (x[i].ToString() != y[i].ToString()) 
       { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 

    public int GetHashCode(DataRow obj) 
    { 

     return string.Join("^", obj.ItemArray.Select((x, i) => (i == 4) || (i > 6) ? "" : x.ToString()).ToArray()).GetHashCode(); 

    } 
} 

Antwort

0

Unter der Annahme, dass Sie einen doppelten Datensatz erhalten, wenn der Wert der ersten Spalte identisch für zwei oder mehr Reihen ist:

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1); 

Hier ist ein Beispiel:

DataTable dt = new DataTable(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Rows.Add(1, "Test1", "Sample1"); 
dt.Rows.Add(2, "Test2", "Sample2"); 
dt.Rows.Add(3, "Test3", "Sample3"); 
dt.Rows.Add(4, "Test4", "Sample4"); 
dt.Rows.Add(5, "Test5", "Sample5"); 

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
Console.WriteLine("Duplicate found: {0}", duplicates.Any()); 

dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(3, "Test6", "Sample6"); // Duplicate on 3 
dt.Rows.Add(5, "Test6", "Sample6"); // Duplicate on 5 

duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
if (duplicates.Any()) 
    Console.WriteLine("Duplicate found for Classes: {0}", String.Join(", ", duplicates.Select(dupl => dupl.Key))); 

Console.ReadLine(); 
+0

Dies wird doppelte Zeilen aus einer einzelnen Datentabelle zurückgeben, aber ich möchte auch gemeinsame Zeilen zwischen zwei Datentabellen erhalten, die auch doppelte Zeilen anzeigen. Z.B. Wenn die erste Datentabelle 2 identische Zeilen A und B enthält, sollte Intersection beide Zeilen anzeigen. –

+0

Versuchen Sie zu tun wie folgt dann: sagen wir, Sie müssen auf ID der Tabelle vergleichen: Tabelle1.Field ("ID") ist gleich Convert.ToInt32 (table2.Field ("ID")) – Lakhtey