2012-03-28 11 views
5

C#でListを使用しています。後述するようにコードがある:私はcreateingい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; 
    } 
} 

一覧は以下のとおりです。

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

は、今私は、リストを反復処理しています。同じScenarioIDを持つリストに重複したテストケースがいくつあるか調べたい。 LinqやListのinbuiltメソッドを使って解決する方法はありますか?最初のアイデアとして

よろしく、 Priyank

+3

あなたの例では、答えは何ですか? 1,2、または3(またはその他)? –

+1

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

+0

重複したアイテムの数をカウントする必要があるのはなぜですか? (奇妙な) –

答えて

18

はこれを試してみてください:

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

ありがとう、トンダニエル:) :) –

8

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

同じシナリオでは何が違うのですか? – daryal

+0

@daryal - より均等な(dupe)定義が必要になります。私が言ったように、それはカウントの問題を解決する大まかなスケッチです。 –

+1

これはそのままでは機能しません。OPのクラス – BrokenGlass

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

以上のものを持っている各ScenarioIDのためにあなたのグループを与えます1つの項目。グループの数は重複グループの数であり、各グループの数は内部的にその単一項目の重複数です。

Where句の.Count()句は、1つ以上の項目が見つかるように各項目を繰り返し処理する必要があるため、.Skip(1).Any()があります。

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

取得するには:多分

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

あなたがそのルートに行く場合は、スキップ(1).Any() 'はより良いアプローチかもしれません。 – BrokenGlass

+0

@BrokenGlassええ、どちらもO(n)ではなく一定時間ですが、確かに良いです。編集されました。 – Servy

4

はちょうど重複カウントを取得するには明確な重複:

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

が総重複の数、さらに別のを取得するには、このような

int duplicateCount = scenarios.GroupBy(x => x.ScenarioID) 
           .Sum(g => g.Count()-1); 
関連する問題