2009-01-27 12 views
7

क्या .NET में दो डेटाटेबल्स के छेड़छाड़ के लिए अपेक्षाकृत सरल तरीका है?दो .NET डेटाटेबल्स का छेड़छाड़ ढूँढना

मैं स्पष्ट तरीकों के बारे में सोच सकता हूं (ओ (एन^2) में दोनों टेबलों पर खुद को दोहराता हूं), लेकिन अगर यह उपलब्ध है तो मुझे कुछ और अधिक सुरुचिपूर्ण चाहिए। मुझे संदेह है कि एक बुद्धिमान तरीका हो सकता है जिसे मैं नहीं देख रहा हूं। पठनीयता और रखरखाव महत्वपूर्ण है, ज़ाहिर है, इसलिए मैं कुछ भी "स्लिम" से दूर रहने की कोशिश कर रहा हूं।

कोई अच्छा विचार?

संपादित करें: ऐसा लगता है ब्रायन वाट 3.5 के लिए एक बहुत बड़ा समाधान है की तरह है, लेकिन दुर्भाग्य से मैं .NET 2.0 में हूँ

+0

डेटा तालिकाओं का स्रोत क्या है? अगर वे एक SQL सर्वर से हैं, तो ऐसा क्यों नहीं करते? – toad

उत्तर

11

.NET 3.5 के साथ (जो मैंने कहा जाना चाहिए था।):

using System.Data; 

public static class DataTableExtensions 
{ 
    public static IEnumerable<DataRow> Intersect(this DataTable table, DataTable other) 
    { 
     return table.AsEnumerable().Intersect(other.AsEnumerable()); 
    } 

    public static IEnumerable<DataRow> Intersect(this DataTable table, DataTable other, IEqualityComparer<DataRow> comparer) 
    { 
     return table.AsEnumerable().Intersect(other.AsEnumerable(), comparer); 
    } 
} 
+0

यह एक अच्छा समाधान है। +1 – Perpetualcoder

+0

यह मेरी विशेष समस्या को हल नहीं करता है, प्रति से, लेकिन यह सामान्य रूप से प्रश्न का एक शानदार समाधान है, जो संभवतः इस समस्या पर खोज करने वाले लोगों के लिए उपयोगी बनाता है, इसे "स्वीकृत" स्थिति कमाने पड़ती है। (मेरी इच्छा है कि यह इसे आपके अन्य उत्तर के साथ साझा कर सके ... दोनों को अच्छा लगेगा।) – Beska

2

इस उदाहरण को MSDN पर देखा गया है जो आपको उपयोगी मिल सकता है। यह LINQ वाक्यविन्यास का उपयोग कर रहा है।

DataSet ds = new DataSet(); 
ds.Locale = CultureInfo.InvariantCulture; 
FillDataSet(ds); 

DataTable orders = ds.Tables["SalesOrderHeader"]; 
DataTable details = ds.Tables["SalesOrderDetail"]; 

var query = 
    from order in orders.AsEnumerable() 
    join detail in details.AsEnumerable() 
    on order.Field<int>("SalesOrderID") equals 
     detail.Field<int>("SalesOrderID") 
    where order.Field<bool>("OnlineOrderFlag") == true 
    && order.Field<DateTime>("OrderDate").Month == 8 
    select new 
    { 
     SalesOrderID = 
      order.Field<int>("SalesOrderID"), 
     SalesOrderDetailID = 
      detail.Field<int>("SalesOrderDetailID"), 
     OrderDate = 
      order.Field<DateTime>("OrderDate"), 
     ProductID = 
      detail.Field<int>("ProductID") 
    }; 


foreach (var order in query) 
{ 
    Console.WriteLine("{0}\t{1}\t{2:d}\t{3}", 
     order.SalesOrderID, 
     order.SalesOrderDetailID, 
     order.OrderDate, 
     order.ProductID); 
} 
1

चूंकि आप .NET 2.0 का उपयोग कर रहे हैं, तो आपको इंटरसेक्ट विधि को फिर से कार्यान्वित करना चाहिए।

This psuedo-code should be very helpful for you.

+1

लिंक अब और काम नहीं कर रहा है – Devjosh

1

संरक्षित शून्य Page_Load (वस्तु प्रेषक, EventArgs ई) {

DataTable dt1 = new DataTable(); 

    dt1.Columns.Add("ColX", typeof(int)); 

    DataTable dt2 = new DataTable(); 

    dt2.Columns.Add("ColX", typeof(int)); 

    for (int i = 1; i <= 5; i++) 
    { 
     DataRow row = dt1.NewRow(); 

     row["ColX"] = 5 + i; 

     dt1.Rows.Add(row); 

     row = dt2.NewRow(); 

     row["ColX"] = 9 + i; 
     dt2.Rows.Add(row); 
    } 


    intesect(dt1, dt2); 

} 


public void intesect(DataTable contacts1, DataTable contacts2) 
{ 
    var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(), DataRowComparer.Default); 


    foreach (DataRow row in contacts) 
    { 
     Response.Write(row["ColX"]); 
    } 
} 
संबंधित मुद्दे