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

查找C#列表中重复项目的计数,c#,list,C#,List,我在C#中使用列表。代码如下所述: TestCase.cs public class TestCase { private string scenarioID; private string error; public string ScenarioID { get { return this.scenarioID; } set {

我在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;
    }
private List GetTestCases()
{
列表场景=新列表();
TestCase scenario1=新的测试用例(“scenario1”,string.Empty);
TestCase scenario2=新的测试用例(“scenario2”,string.Empty);
TestCase scenario3=新的测试用例(“Scenario1”,string.Empty);
TestCase scenario4=新的测试用例(“scenario4”,string.Empty);
TestCase scenario5=新的测试用例(“Scenario1”,string.Empty);
TestCase scenario6=新的测试用例(“scenario6”,string.Empty);
TestCase scenario7=新的测试用例(“scenario7”,string.Empty);
场景。添加(场景1);
场景。添加(场景2);
场景。添加(场景3);
场景。添加(场景4);
场景。添加(场景5);
场景。添加(场景6);
场景。添加(场景7);
返回场景;
}
现在,我正在遍历列表。我想找出在一个具有相同ScenarioID的列表中有多少重复的测试用例。是否有任何方法可以使用Linq或列表的任何内置方法来解决此问题

问候,, Priyank作为第一个想法:

int dupes = list.Count() - list.Distinct(aTestCaseComparer).Count();
试试这个:

var numberOfTestcasesWithDuplicates = 
    scenarios.GroupBy(x => x.ScenarioID).Count(x => x.Count() > 1);
这将为每个具有多个项的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));

你的例子中的答案是什么?1、2或3(或其他)?为什么需要计算重复项目?(好奇)使用linq,按场景ID分组,然后计算每个组的大小。或者创建一个字典,使用scenarioID作为键,并存储id的计数作为值。我不确定我是否理解您要查找的内容。@daryal-需要更好的equal(dupe)定义。正如我试图说的,这是一个解决计数问题的粗略草图。这不是开箱即用的-您忽略了实现自定义相等比较器或覆盖OP内相等的需要class@broken-插入占位符。
跳过(1)。如果您想这样做,Any()
可能是更好的方法route@BrokenGlass是 啊两者都是常数时间而不是O(n),但你的确实更好;编辑。
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());