2012-03-28 27 views
5

Sto utilizzando Elenco in C#. Codice è come indicato di seguito:Trova il conteggio di elementi duplicati in un elenco C#

TestCase.cs

public class TestCase 
{ 
    private string scenarioID; 
    private string error; 

    public string ScenarioID 
    { 
     get 
     { 
      return this.scenarioID; 
     } 
     set 
     { 
      this.scenarioID = value; 
     } 
    } 

    public string Error 
    { 
     get 
     { 
      return this.error; 
     } 
     set 
     { 
      this.error = value; 
     } 
    } 

    public TestCase(string arg_scenarioName, string arg_error) 
    { 
     this.ScenarioID = arg_scenarioName; 
     this.Error = arg_error; 
    } 
} 

Lista sto createing è:

private List<TestCase> GetTestCases() 
    { 
     List<TestCase> scenarios = new List<TestCase>(); 
     TestCase scenario1 = new TestCase("Scenario1", string.Empty); 
     TestCase scenario2 = new TestCase("Scenario2", string.Empty); 
     TestCase scenario3 = new TestCase("Scenario1", string.Empty); 
     TestCase scenario4 = new TestCase("Scenario4", string.Empty); 
     TestCase scenario5 = new TestCase("Scenario1", string.Empty); 
     TestCase scenario6 = new TestCase("Scenario6", string.Empty); 
     TestCase scenario7 = new TestCase("Scenario7", string.Empty); 

     scenarios.Add(scenario1); 
     scenarios.Add(scenario2); 
     scenarios.Add(scenario3); 
     scenarios.Add(scenario4); 
     scenarios.Add(scenario5); 
     scenarios.Add(scenario6); 
     scenarios.Add(scenario7); 

     return scenarios; 
    } 

Ora sto scorrendo l'elenco. Voglio trovare il numero di test duplicati presenti in un elenco con lo stesso ScenarioID. C'è un modo per risolverlo usando Linq o qualsiasi metodo integrato per List?

saluti, Priyank

+3

Qual è la risposta nel tuo esempio? 1, 2 o 3 (o altro)? –

+1

http://stackoverflow.com/questions/5080538/c-sharp-determine-duplicate-in-list – assylias

+0

Perché è necessario contare gli elementi duplicati? (Curioso) –

risposta

18

Prova questa:

var numberOfTestcasesWithDuplicates = 
    scenarios.GroupBy(x => x.ScenarioID).Count(x => x.Count() > 1); 
+0

grazie a ton daniel :) :) –

8

Come prima idea:

int dupes = list.Count() - list.Distinct(aTestCaseComparer).Count(); 
+0

Cosa succede se con lo stesso scenarioId ma errori diversi? – daryal

+0

@daryal - sarà necessaria una migliore definizione di uguale (dupe). Come ho cercato di dire, è uno schizzo approssimativo che risolve il problema del conteggio. –

+1

Questo non funzionerà immediatamente, hai omesso la necessità di implementare un comparatore di uguaglianza personalizzato o di eseguire l'override dell'uguaglianza all'interno della classe OP – BrokenGlass

4
var groups = scenarios.GroupBy(test => test.ScenarioID) 
    .Where(group => group.Skip(1).Any()); 

che vi darà un gruppo per ogni ScenarioID che ha più di un articolo. Il conteggio dei gruppi è il numero di gruppi duplicati e il conteggio di ciascun gruppo internamente è il numero di duplicati di quell'elemento singolo.

Nota aggiuntiva, il numero .Skip(1).Any() è presente perché nella clausola Where bisognerebbe iterare ogni singolo articolo solo per scoprire che ce ne sono più di uno nella clausola .Count().

+0

'Skip (1) .Any()' potrebbe essere un approccio migliore se si vuole seguire quella rotta – BrokenGlass

+0

@BrokenGlass Sì, entrambi sono costanti invece di O (n), ma i tuoi è davvero meglio; modificato. – Servy

4

per ottenere solo il duplicato conteggio:

int duplicateCount = scenarios.GroupBy(x => x.ScenarioID) 
           .Sum(g => g.Count()-1); 
2

Qualcosa di simile forse

var result= GetTestCases() 
      .GroupBy (x =>x.ScenarioID) 
      .Select (x =>new{x.Key,nbrof=x.Count()}); 
1

per ottenere il numero totale di duplicati, l'ennesimo:

var set = new HashSet<string>(); 
var result = scenarios.Count(x => !set.Add(x.ScenarioID)); 

Per ottenere duplicati distinti:

var result = scenarios.GroupBy(x => x.ScenarioID).Count(x => x.Skip(1).Any()); 
Problemi correlati