У меня есть список адресов электронной почты, и я хочу сгруппировать их по mylist с доменными именами или определенной подстрокой, содержащей все элементы строки (например, @gmail.com или @yahoo.com).
Обратите внимание, что я не хочу использовать только gmail и yahoo, потому что существует много доменов, таких как @yahoo.fr или @hotmail.com.
После этого я хочу добавить все элементы подгруппы в отдельную строку списка.
например.:
var Emails = new List<string>
{
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
};
Я пробовал группировать с параметром регулярного выражения, но это не сработало.
Да, я хочу сгруппировать по домену
Пожалуйста, добавьте точные результаты, которые вы ожидаете





Вы можете попробовать .ToLookup() и передать либо регулярное выражение, либо подстроку из индекса @
Весело. У @ProgrammingLlama есть хорошая идея со словарем.
using System.Text.Json;
List<string> emails = new()
{
"[email protected]",
"[email protected]",
"[email protected]",
"notanemail",
"[email protected]",
"[email protected]"
};
var groupedEmails = from email in emails
where email.Contains("@")
let domain = email.Substring(email.IndexOf("@") + 1)
group email by domain into g
select new { Domain = g.Key, Emails = g };
var dictionaryEmails = groupedEmails.ToDictionary(x => x.Domain, x => x.Emails);
System.Console.WriteLine(JsonSerializer.Serialize(dictionaryEmails, new JsonSerializerOptions { WriteIndented = true }));
Результат
{
"gmail.com": [
"[email protected]"
],
"yahoo.fr": [
"[email protected]",
"[email protected]"
],
"tafmail.com": [
"[email protected]"
],
"mail.ru": [
"[email protected]"
]
}
Вы можете использовать это, чтобы получить словарь домена для адресов электронной почты:
Dictionary<string, List<string>> emailsByDomain = emails
.GroupBy(e => e.Split('@', 2)[1].ToLowerInvariant())
.ToDictionary(g => g.Key, g => g.ToList());
По сути, мы разделяем адрес электронной почты на «@», берем вторую половину, преобразуем ее в нижний регистр, а затем используем ее в качестве словарного ключа.
Если есть вероятность, что часть вашего списка может не быть адресом электронной почты (без @), вы можете отфильтровать их с помощью .Where:
Dictionary<string, List<string>> emailsByDomain = emails
.Where(e => e.IndexOf('@', StringComparison.Ordinal) >= 0)
.GroupBy(e => e.Split('@', 2)[1].ToLowerInvariant())
.ToDictionary(g => g.Key, g => g.ToList());
Обратите внимание, что в зависимости от вашей версии .NET вам может потребоваться изменить строку .GroupBy на эту: .GroupBy(e => e.Split(new string[] { "@" }, 2, StringSplitOptions.None)[1].ToLowerInvariant())
Вы хотите сгруппировать по домену? Или что?