using System.Collections.Generic;
public static void Main()
var seed = new List<string>()
.Select(s => new EmailAddress(s))
.Select(g => new EmailAddressGroup(g))
var currentDomain = string.Empty;
var noDups = work.Where(w => w.Domain != currentDomain);
var workGroup = noDups.First(w => w.Count() == noDups.Max(g => g.Count()));
var workItem = workGroup.Remove();
if (workGroup.Count() == 0)
Console.WriteLine("removed: " + workGroup.Domain);
Console.WriteLine(workItem.FullEmail);
currentDomain = workItem.Domain;
Console.WriteLine("Cannot disperse email addresses affectively, left overs:");
foreach(var workGroup in work)
while(workGroup.Count() > 0)
var item = workGroup.Remove();
Console.WriteLine(item.FullEmail);
public class EmailAddress
public EmailAddress(string emailAddress)
var result = emailAddress.Split(new char[] {'@'}, StringSplitOptions.RemoveEmptyEntries)
new ArgumentException("emailAddress");
this.FullEmail = emailAddress;
public string Name { get; private set; }
public string Domain { get; private set; }
public string FullEmail { get; private set; }
public class EmailAddressGroup
private List<EmailAddress> _emails;
public EmailAddressGroup(IEnumerable<EmailAddress> emails)
this._emails = emails.ToList();
this.Domain = emails.First().Domain;
public string Domain { get; private set; }
public EmailAddress Remove()
var result = _emails.First();