2012-05-24 14 views
6

मेरे पास एक सूची है। मैं सूची में प्रत्येक डेटाटेबल में मौजूद सभी पंक्तियों को खोजने के लिए तालिकाओं की सूची में सभी पंक्तियों के माध्यम से फ़िल्टर करना चाहता हूं।डेटाटेबल्स की सूची में डेटारोस को छेड़छाड़ करना

यदि संभव हो, तो तुलना प्रत्येक पंक्ति पर "आईडी" कॉलम पर होनी चाहिए।

मैंने लिंकक के साथ इसे हल करने का प्रयास किया है लेकिन अटक गया है। यह मेरे पास अब तक है:

List<DataTable> dataTables = new List<DataTable>(); 

// fill up the list 
List<DataRow> dataRows = 
    dataTables.SelectMany(dt => dt.Rows.Cast<DataRow>().AsEnumerable()). 
    Aggregate((r1, r2) => r1.Intersect(r2)); 

कोई सुझाव?

+0

किसी भी समय मैंने अतीत में अंतर का उपयोग किया है और अस्थिर आ गया है, यह पूरी तरह से समानता तुलना के कारण रहा है - आदिम प्रकारों के अंक के साथ काम करना आमतौर पर ठीक है, लेकिन जटिल प्रकारों को तुलना करने के संदर्भ में मुझे हमेशा ओवरराइड करना पड़ता है । यदि आप पहले से नहीं हैं तो जांच करने योग्य मूल्य – SpaceBison

उत्तर

4

नहीं एक साधारण सवाल। यहां एक समाधान है (जो मेरे लिए बहुत जटिल लगता है, लेकिन यह काम करता है)।

  • एकाधिक सूचियों इंटरसेक्ट डेटासेट से LINQ का उपयोग कर प्रत्येक पंक्ति से ईद मूल्य प्राप्त होने वाली पंक्तियां में से एक है के सभी के सभी समान मूल्यों
  • एक पंक्ति के एक भी घटना का पता लगाएं खोजने के लिए मिलान ids

डेटाटेबल पर लिंक का उपयोग करने के लिए, this article प्रारंभ के लिए देखें।

आप इस

var ids = dt.AsEnumerable().Select (d => d.Field<int>("ID")).OfType<int>(); 

कई तालिकाओं

var setsOfIds = dataTables.Select (
    t => t.AsEnumerable().Select (x => x.Field<int>("ID")).OfType<int>()); 

की तरह और से एक मेज से आईडी प्राप्त एकाधिक सूचियों एक दूसरे को काटना करने के लिए, this article की कोशिश कर सकते। वहां विधियों में से एक का उपयोग करके आप सभी आईडी के चौराहे को प्राप्त कर सकते हैं।

जॉन स्कीट सहायक विधि

public static class MyExtensions 
{ 
    public static List<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> lists) 
    { 
     HashSet<T> hashSet = new HashSet<T>(lists.First()); 
     foreach (var list in lists.Skip(1)) 
     { 
      hashSet.IntersectWith(list); 
     } 
     return hashSet.ToList(); 
    } 
} 

इस्तेमाल करते हुए हम

var commonIds = setsOfIds.InsersectAll(); 

अब आम आईडी द्वारा DataTables और फिल्टर से सभी पंक्तियों को समतल लिख सकते हैं:

var rows = dataTables.SelectMany (t => t.AsEnumerable()).Where(
    r => commonIds.Contains(r.Field<int>("ID"))); 

अब समूह आईडी द्वारा और प्रत्येक पंक्ति का पहला उदाहरण लें:

var result = rows.GroupBy (r => r.Field<int>("ID")).Select (r => r.First()); 
1

दो सूचियों के बीच चौराहे खोजने के लिए इस प्रयास करें:

r1.Join(r2, r1 => r1.Id, r2 => r2.Id, (r1, r2) => r1); 
संबंधित मुद्दे