2012-03-28 13 views
5

Ich verwende Liste in C#. Code ist wie unten erwähnt:Finden Sie die Anzahl der doppelten Elemente in einer C# -Liste

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; 
    } 
} 

Liste I createing bin ist:

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; 
    } 

Jetzt habe ich durch die Liste am iterieren. Ich möchte die Anzahl der doppelten Testfälle in einer Liste mit derselben ScenarioID finden. Gibt es eine Möglichkeit, es mit Linq oder einer eingebauten Methode für List zu lösen?

Grüße, Priyank

+3

Was ist die Antwort in Ihrem Beispiel? 1, 2 oder 3 (oder andere)? –

+1

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

+0

Warum müssen Sie die doppelten Elemente zählen? (Neugierig) –

Antwort

18

Try this:

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

danke eine Tonne daniel :) :) –

8

Als erste Idee:

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

Was ist, wenn mit demselben scenarioId, aber verschiedenen Fehlern? – daryal

+0

@daryal - eine bessere Definition von gleich (dupe) wird benötigt. Wie ich versucht habe zu sagen, ist es eine grobe Skizze, die das Zählproblem löst. –

+1

Dies funktioniert nicht out-of-the-box - Sie haben nicht die Notwendigkeit, entweder eine benutzerdefinierte Equality Comparer oder überschreiben Gleichheit in OP-Klasse – BrokenGlass

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

die Sie für jede ScenarioID eine Gruppe geben, die mehr hat als ein Artikel. Die Anzahl der Gruppen ist die Anzahl der doppelten Gruppen und die Zählung jeder Gruppe intern ist die Anzahl der Duplikate dieses einzelnen Elements.

Zusätzliche Anmerkung, die .Skip(1).Any() ist da, weil ein .Count() in der Where Klausel nur jeden einzelnen Artikel wiederholen müßten, um herauszufinden, dass es mehr als eins ist.

+0

'Skip (1) .Any()' könnte ein besserer Ansatz sein, wenn Sie diese Route gehen wollen – BrokenGlass

+0

@BrokenGlass Ja, beide sind konstante Zeit statt O (n), aber deins ist in der Tat besser; bearbeitet. – Servy

4

Um nur die doppelte Zählung:

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

So etwas wie dies vielleicht

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

Gesamtzahl der Duplikate zu erhalten, noch eine andere:

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

Um verschiedene Duplikate:

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