Показать дубликаты из списков c # - PullRequest
3 голосов
/ 24 сентября 2019

Я работаю над приложением WPF, и в какой-то момент мне нужно получить / показать все дубликаты из списка строк.(С именем дублированных строк и количеством этих строк в списке). Пример: «Список содержит строку« Hello »3 раза».До сих пор я получаю имя строки успешно, но мне не удается получить правильное количество раз, которое она представлена ​​в списке.Это мой код:

List<String> answerData = new List<String>();

using (MySqlCommand command = new MySqlCommand(query2, conn))
                {
                    using (MySqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            answerData.Add(reader.GetString(0));
                        }
                    }
                }

var duplicates = answerData
                .GroupBy(i => i)
                .Where(g => g.Count() > 1)
                .Select(g => g.Key);

foreach (var d in duplicates)
{           
    MessageBox.Show(""+ d + duplicates.Count().ToString()); //Here I tried to get the number
    //with Count() but it doesn't work as I thought it would. 

}

Что я должен добавить / изменить, чтобы получить желаемый результат?

РЕДАКТИРОВАТЬ

Как предложено, мой код изменился на следующее:

var duplicates = answerData
                .GroupBy(i => i)
                .Where(g => g.Count() > 1);

foreach (var d in duplicates)
{
  MessageBox.Show(d.Key + " " + d.Count().ToString());
}

И теперь все работает гладко.Спасибо всем!

Ответы [ 3 ]

5 голосов
/ 24 сентября 2019

Сохраните фактические группы вместо ключей в duplicates:

var duplicates = answerData
            .GroupBy(i => i)
            .Where(g => g.Count() > 1);

Затем вы можете выполнить итерацию по группам:

foreach (var d in duplicates)
{           
    MessageBox.Show(d.Key + " " + d.Count().ToString());
}

В этом примере подсчитывается, то есть повторяется, каждаягруппа дважды.Кроме того, вы можете хранить объекты, которые содержат как Key, так и Count, как предложено @ HimBromBeere.

4 голосов
/ 24 сентября 2019

Вам просто нужно вернуть номер в вашем Select:

var duplicates = answerData
            .GroupBy(i => i)
            .Select(g => new { Key = g.Key, Count = x.Count() })
            .Where(x => x.Count > 1);

Обратите внимание, что я изменил порядок ваших выписок, чтобы избежать дублирования выполнения g.Count().

0 голосов
/ 24 сентября 2019

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

            List<String> answerData = new List<String>();

        Dictionary<string,int> map = new Dictionary<string, int>();
        foreach (var data in answerData)
        {
            if (map.ContainsKey(data))
            {
                map[data]++;
            }
            else
            {
                map.Add(data, 1);
            }
        }

        foreach (var item in map)
        {
            if (item.Value > 1)
            {
                Console.WriteLine("{0} - {1}", item.Key, item.Value);

            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...