查找C#列表中重复项的计数

本文关键字:列表 查找 | 更新日期: 2023-09-27 18:29:11

我在C#中使用List。代码如下所述:

测试用例.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的任何内置方法来解决这个问题?

谨致问候,Priyank

查找C#列表中重复项的计数

试试这个:

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

作为第一个想法:

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

只获取重复计数

int duplicateCount = scenarios.GroupBy(x => x.ScenarioID)
                              .Sum(g => g.Count()-1);
var groups = scenarios.GroupBy(test => test.ScenarioID)
    .Where(group => group.Skip(1).Any());

这将为每个拥有多个项目的ScenarioID提供一个组。组的计数是重复组的数量,每个组内部的计数是单个项目的重复数量。

另外要注意的是,.Skip(1).Any()之所以存在,是因为Where子句中的.Count()需要迭代每一个项目,才能发现不止一个。

像这样的东西可能是

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

要获得重复的总数,还有一个:

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

要获得不同的重复:

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