C#列表中重复项的计数

时间:2018-11-28 05:09:30

标签: c# arrays list linq counting

我想知道如何计算winform应用程序中C#列表中的所有重复字符串。

List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };

例如,我有上面的列表,计数为5,因为“红色”出现3次,“蓝色”出现两次。

很高兴使用循环或LINQ或任何必要的东西。

在我的实际程序中,此列表可以包含1000个条目,因此可能会更大,因此性能也是要考虑的问题。

谢谢!

4 个答案:

答案 0 :(得分:7)

如果您只需要总数:

var total = colorList.GroupBy(_ => _).Where(_ => _.Count() > 1).Sum(_ => _.Count());

对于大型数据集,这可能会更快:

var hashset = new HashSet<string>(); // to determine if we already have seen this color
var duplicates = new HashSet<string>(); // will contain the colors that are duplicates
var count = 0;
foreach (var color in colorList)
{
    if (!hashset.Add(color))
    {
        count++;
        if (duplicates.Add(color))
            count++;
    }
}

更新:两种方法都以2 ^ 25(约3000万)项的列表进行了测量:第一个为3.7秒,第二个为3.2秒。

答案 1 :(得分:3)

如果您只需要计数重复项:

 List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };

 var count = colorList.GroupBy(item => item)
                      .Where(item => item.Count() > 1)
                      .Sum(item => item.Count());

尝试此操作以获取逐项详细信息:

var result = colorList.GroupBy(item => item)
                      .Select(item => new
                          {
                              Name = item.Key,
                              Count = item.Count()
                          })
                      .OrderByDescending(item => item.Count)
                      .ThenBy(item => item.Name)
                      .ToList();

答案 2 :(得分:0)

好吧,我会在没有分组依据的情况下完成

List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
        var count = 0;
        foreach (var item in colorList.Distinct().ToList())
        {
            var cnt = colorList.Count(i => i.Equals(item, StringComparison.InvariantCultureIgnoreCase));
            if (cnt > 1)
                count += cnt;

        }

答案 3 :(得分:0)

计算C#中重复项的另一种方法可以如下:-

LTRIM