2013-01-07 27 views
9

हटाएं मेरे पास दो सूचियां हैं। मैं LIST1 से किसी भी आइटम को हटाना चाहता हूं जो LIST2 में मौजूद नहीं है।LINQ दो सूचियों की तुलना करें और

उदाहरण के लिए

तो:

 var list1 = new List<DownloadTask>(); 
     list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

     var list2 = new List<DownloadTask>(); 
     list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

रन list1 के बाद केवल आइटम शामिल करना चाहिए: संयोजन operationId = 1, machineId = 1 और OperationId = 3, MachineId =2 साथ।

+0

दूसरे शब्दों में, आप इन दो सूचियों में सामान्य तत्वों का सेट खोजना चाहते हैं। – user3454439

उत्तर

13

करता DownloadTask ओवरराइड Equals और GetHashCode सही ढंग से? यदि हां, तो आप सभी की जरूरत है:

list1 = list1.Intersect(list2).ToList(); 

है कि यदि आप एक नई सूची बनाने के लिए निश्चित रूप से, हमें खुशी है। यदि आप वास्तव में उन्हें मौजूदा सूची से हटाना चाहते हैं, तो यह थोड़ा कठिन है। यह काफी संभवतः सबसे सरल होना बाहर काम करने के परिणाम की तरह, क्या देखना चाहिए होगा तो स्पष्ट और फिर से जोड़ने:

var newList = list1.Intersect(list2).ToList(); 
list1.Clear(); 
list1.AddRange(newList); 
बेशक

, यह सब DownloadTask में उचित रूप से समानता लागू करने के लिए आप की आवश्यकता होती है - लेकिन अगर आपने पहले से ऐसा नहीं किया है, ऐसा लगता है कि ऐसा करना एक अच्छा विचार होगा। (या कम से कम IEqualityComparer<DownloadTask> कहीं लागू - आप Intersect करने के लिए एक comparer पारित कर सकते हैं।)

एक तरफ ध्यान दें के रूप में, मैं देखने "केवल list1 जो list2 में भी कर रहे हैं में तत्वों रखने" (यानी चौराहे) का एक सरल तरीके के रूप में list1 से सभी तत्वों को हटाएं, जो list2 में नहीं हैं "की तुलना में समस्या को देखते हुए - बाद वाला मूल रूप से एक डबल नकारात्मक है, जो हमेशा दर्द का थोड़ा सा होता है।

16

मुझे लगता है कि यह होना चाहिए:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID)); 
+0

धन्यवाद, कोड की वास्तविक संतुष्टि रेखा ... – Avishek

5
var lst = (from lst1 in list1 
      where !list2.Any(
           x => x.OperationID == lst1.OperationID && 
            x.MachineID == lst1.MachineID) 
      select lst1).ToList(); 

    list1 = lst.ToList(); 

कृपया इसे आजमाएं इसे आजमाएं।

+0

यह काम करता है ... आप को ..... –

संबंधित मुद्दे