Подсчитайте повторяющиеся элементы в списке <string>и сохраните их в разных файлах (или списках / массивах / строках) - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно сосчитать повторяющиеся значения в списке и сохранить их в разных файлах. С именем файла, содержащего провайдера электронной почты и номер или дубликаты.

Список всегда изменяется и имеет разные значения, но может выглядеть так:

List<string> email_domains = new List<string>()     
{
    "gmail.com",
    "gmail.com",
    "outlook.com",
    "outlook.com",
    "outlook.com",
    "outlook.com",
    "ineria.pl",
    "mail.ru"
}

Результат, который я хочу получитьэто что-то вроде этого:

gmail.com [2]
outlook.com[4]

Ответы [ 3 ]

2 голосов
/ 24 октября 2019
var email_domains = new List<string>()
{
    "gmail.com",
    "gmail.com",
    "outlook.com",
    "outlook.com",
    "outlook.com",
    "outlook.com",
    "ineria.pl",
    "mail.ru"
};

var results = email_domains.GroupBy(x => x);
foreach (var domain in results)
{
    Console.WriteLine("{0} [{1}]", domain.Key, domain.Count());
}

Вместо Console.WriteLine() вы можете записать в файл.

Если вы хотите, чтобы элементы имели хотя бы один дубликат, добавьте дополнительное условие:

foreach (var domain in email_domains.GroupBy(x => x).Where(x => x.Count() > 1))
{
    Console.WriteLine("{0} [{1}]", domain.Key, domain.Count());
}
1 голос
/ 24 октября 2019
var result = email_domains.GroupBy(_ => _)
                 .Select(g => new { Domain = g.Key, Count = g.Count() })
                 .Where(_ => _.Count > 1);

Вместо анонимного типа вы также можете выбрать в Dictionary<string, int>:

var result = email_domains.GroupBy(_ => _)
                  .Where(g => g.Count() > 1)
                  .ToDictionary(g => g.Key, g => g.Count());
0 голосов
/ 24 октября 2019

Вы можете попробовать это с помощью Linq to Objects:

var query = from item in email_domains
            group item by item into g
            where g.Count() > 1
            select new { email = g.Key, count = g.Count() };

foreach ( var item in query )
  File.WriteAllText($"c:\\{item.email} ({item.count}).txt", item.email);

Запрос выбирает элементы, сгруппированные по одному и тому же адресу электронной почты, имеющие более одного вхождения.

Затем мы сохраняем результат в файлы.

Вы можете заменить , item.email) на то, что вы хотите, используя WriteAllText или AllLines, если у вас есть многострочный.

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