2010-04-27 21 views
8

में डुप्लिकेट आइटमों के सूचकांक को खोजने का सबसे शानदार तरीका क्या है मेरे पास List<string> है जिसमें डुप्लीकेट हैं और मुझे प्रत्येक के इंडेक्स ढूंढने की आवश्यकता है।सी # सूची

सभी वस्तुओं के माध्यम से लूपिंग के अलावा सबसे सुरुचिपूर्ण, कुशल तरीका क्या है। मैं .NET 4.0 पर हूं इसलिए LINQ एक विकल्प है। मैंने बहुत सारी खोज की है और कुछ भी ढूंढने को जोड़ दिया है।

नमूना डेटा:

var data = new List<string>{"fname", "lname", "home", "home", "company"}(); 

मैं "घर" की अनुक्रमित पाने के लिए की जरूरत है।

+11

सूची में कितने आइटम हैं? क्या यह हल किया गया है? क्या यह क्रमबद्ध है? आप समानता की तुलना कैसे कर रहे हैं? क्या इसे किसी भी डेटा प्रकार या सिर्फ तारों के लिए काम करना है? आप सूची में डुप्लिकेट को पहली जगह क्यों डाल रहे हैं? आपने सबसे सुरुचिपूर्ण और सबसे कुशल के लिए कहा लेकिन वे अक्सर विरोध करते हैं; जो वास्तव में अधिक महत्वपूर्ण है? –

+1

आप "वस्तुओं के माध्यम से लूपिंग के अलावा" क्यों कहते हैं? किसी को किसी बिंदु पर वस्तुओं के माध्यम से लूप करना पड़ता है - चाहे वह आप या linq है कि यह निश्चित रूप से अप्रासंगिक है। – Stewart

उत्तर

19

आप प्रत्येक आइटम से अपने ऑब्जेक्ट से ऑब्जेक्ट बना सकते हैं, फिर मान पर समूह बना सकते हैं और एक से अधिक ऑब्जेक्ट वाले समूहों को फ़िल्टर कर सकते हैं। अब आप और पाठ वाली वस्तुओं को उनके मूल सूचकांक के साथ एक समूहीकरण सूची है:

var duplicates = data 
    .Select((t,i) => new { Index = i, Text = t }) 
    .GroupBy(g => g.Text) 
    .Where(g => g.Count() > 1); 
+0

मुझे यह समाधान पसंद है! पढ़ने और जल्दी करने में आसान! –

+0

धन्यवाद यह सबसे सुरुचिपूर्ण समाधान था जिसे मैं –

3
using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var data = new List<string> { "fname", "lname", "home", "home", "company" }; 
     foreach (var duplicate in FindDuplicates(data)) 
     { 
      Console.WriteLine("Duplicate: {0} at index {1}", duplicate.Item1, duplicate.Item2); 
     } 
    } 

    public static IEnumerable<Tuple<T, int>> FindDuplicates<T>(IEnumerable<T> data) 
    { 
     var hashSet = new HashSet<T>(); 
     int index = 0; 
     foreach (var item in data) 
     { 
      if (hashSet.Contains(item)) 
      { 
       yield return Tuple.Create(item, index); 
      } 
      else 
      { 
       hashSet.Add(item); 
      } 
      index++; 
     } 
    } 
} 
0

यह कैसे

var data = new List<string>{"fname", "lname", "home", "home", "company"}; 

      var duplicates = data 
          .Select((x, index) => new { Text = x, index}) 
          .Where(x => ( data 
              .GroupBy(i => i) 
              .Where(g => g.Count() > 1) 
              .Select(g => g.Key).ToList() 
             ).Contains(x.Text)); 
+0

इंटरस्टेस्टिंग, लेकिन बहुत अक्षम पाया। आपको सूची में प्रत्येक आइटम के लिए एक बार के बजाय एक बार लुकअप बनाना चाहिए। कुशल होने के लिए लुकअप एक हैशसेट होना चाहिए, सूची नहीं। – Guffa

0

मैं अपने आप को खोजने के लिए और की सूची में से डुप्लिकेट निकालने की जरूरत की तरह कुछ के बारे में तार। मैंने पहली बार डुप्लिकेट आइटम्स के इंडेक्स की खोज की और फिर मूल सूची को म्यूट किए बिना LINQ का उपयोग करके कार्यात्मक तरीके से सूची फ़िल्टर की:

public static IEnumerable<string> RemoveDuplicates(IEnumerable<string> items) 
{ 
    var duplicateIndexes = items.Select((item, index) => new { item, index }) 
          .GroupBy(g => g.item) 
          .Where(g => g.Count() > 1) 
          .SelectMany(g => g.Skip(1), (g, item) => item.index); 
    return items.Where((item, index) => !duplicateIndexes.Contains(index)); 
} 
संबंधित मुद्दे