Количество повторяющихся элементов в списке C # - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел знать, как подсчитать все повторяющиеся строки в списке в C # в приложении Winform.

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

Например, у меня есть список выше, и счет будет 5, потому что "красный"появляется 3 раза, а "синий" появляется дважды.

Рад использовать циклы, LINQ или что-нибудь необходимое.

В моей реальной программе этот список может быть значительно больше с тысячами записей, поэтому производительность - это нечтоучитывать также.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Еще один способ подсчета дубликатов элементов в C # может быть следующим: -

 var duplicates = from d in list
 group d by d into c
 let count = c.Count()
 orderby count descending
 select new { Value = c.Key, Count = count };

  foreach (var v in duplicates)
  {
     string strValue = v.Value;
     int Count = v.Count;
  }
0 голосов
/ 28 ноября 2018

Если вам просто нужен общий счет:

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 (около 30 миллионов) записей: первая 3,7 секунды, вторая 3,2 секунды.

0 голосов
/ 28 ноября 2018

Ну, я бы сделал это без группы по

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;

        }
0 голосов
/ 28 ноября 2018

Если вам просто нужно количество дублирующихся предметов:

 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();
...