我正在寻找一种在 C# 中对电子邮件地址数组进行排序的有效方法,以避免具有相同域的项目连续。
数组内的电子邮件地址已经是不同的,并且全部都是小写。
Example:
给定一个包含以下条目的数组:
[email protected] /cdn-cgi/l/email-protection
jane_d[email protected] /cdn-cgi/l/email-protection
[email protected] /cdn-cgi/l/email-protection
[email protected] /cdn-cgi/l/email-protection
我想获得类似于以下内容的东西:
[email protected] /cdn-cgi/l/email-protection
patric[email protected] /cdn-cgi/l/email-protection
[email protected] /cdn-cgi/l/email-protection
[email protected] /cdn-cgi/l/email-protection
借助扩展方法(从https://stackoverflow.com/a/27533369/172769 https://stackoverflow.com/a/27533369/172769),你可以这样:
List<string> emails = new List<string>();
emails.Add("[email protected] /cdn-cgi/l/email-protection");
emails.Add("[email protected] /cdn-cgi/l/email-protection");
emails.Add("[email protected] /cdn-cgi/l/email-protection");
emails.Add("[email protected] /cdn-cgi/l/email-protection");
var q = emails.GroupBy(m => m.Split('@')[1]).Select(g => new List<string>(g)).Interleave();
The Interleave
方法定义为:
public static IEnumerable<T> Interleave<T>(this IEnumerable<IEnumerable<T>> source )
{
var queues = source.Select(x => new Queue<T>(x)).ToList();
while (queues.Any(x => x.Any())) {
foreach (var queue in queues.Where(x => x.Any())) {
yield return queue.Dequeue();
}
}
}
所以基本上,我们根据电子邮件地址的域部分创建组,将每个组投影(或选择)到List<string>
,然后“交错”这些列表。
我已经针对您的示例数据进行了测试,但可能需要更彻底的测试才能找到边缘情况。
DotNetFiddle 片段 https://dotnetfiddle.net/DXDZvj
Cheers
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)