2012-11-05 17 views
7

मैं सी #/LINQ निम्न आवश्यकताओं को पूरा करने के लिए का उपयोग कर एक प्रश्न को डिजाइन करने में थोड़ी सहायता रहा हूँ:, डुप्लिकेट रिकॉर्ड का पता लगा रहा केवल पहले का चयन करके और साथ गिनती LINQ/सी #

मैं कंपनियों की एक सूची है: -

Id Name    Email  Address 

1 Company A   [email protected]  abc 

2 Company B   [email protected]  abc 

3 Company C   [email protected]  abc 

4 Company D   [email protected]  abc 

5 Company A   [email protected]  abc 

मेरा लक्ष्य दो क्षेत्रों के आधार पर डुप्लिकेट आइटम का पता लगाने के इस उदाहरण 'नाम' और 'ई-मेल' में, है।

  1. डुप्लिकेट ग्राहकों को केवल एक बार
  2. दिखाया जा shuold समान अभिलेखों की मात्रा दिखाया जाना चाहिए:

    वांछित उत्पादन नीचे दिखाया गया है ग्राहकों की एक सूची है।

वांछित डुप्लिकेट सूची: -

Id Qty Name  Email  Address 

1 2 Company A  [email protected]  abc (Id/details of first) 

2 1 Company B  [email protected]  abc 

3 1 Company C  [email protected]  abc 

4 1 Company D  [email protected]  abc 
+0

आउटपुट आईडी के लिए यह अजीब बात है, कंपनी ए के लिए सही आईडी क्या है? –

+0

http://stackoverflow.com/questions/1606679/remove-duplicates-in-the-list-using-linq –

+2

@RohitVyas वे समाधान डुप्लिकेट रिकॉर्ड हटाते हैं लेकिन प्रत्येक मामले में डुप्लिकेट रिकॉर्ड की संख्या गिनते नहीं हैं। –

उत्तर

9

आप स्पष्ट रूप से डुप्लिकेट के प्रत्येक सेट में सबसे कम आईडी रिकॉर्ड का उपयोग करना चाहते हैं, तो आप इस्तेमाल कर सकते हैं

var duplicates = companies 
    .GroupBy(c => new { c.Name, c.Email }) 
    .Select(g => new { Qty = g.Count(), First = g.OrderBy(c => c.Id).First() }) 
    .Select(p => new 
     { 
      Id = p.First.Id, 
      Qty = p.Qty, 
      Name = p.First.Name, 
      Email = p.First.Email, 
      Address = p.First.Address 
     }); 

यदि आप डॉन परवाह नहीं है कि रिकॉर्ड के मूल्यों का उपयोग किया जाता है, या यदि आपका स्रोत पहले ही आईडी (आरोही) द्वारा क्रमबद्ध है, तो आप OrderBy कॉल छोड़ सकते हैं।

4
from c in companies 
group c by new { c.Name, c.Email } into g 
select new 
{ 
    Id = g.First().Id, 
    Qty = g.Count(), 
    Name = g.Key.Name, 
    Email = g.Key.Email, 
    Address = g.First().Address 
}; 
संबंधित मुद्दे