问题描述
我正在寻找一种有效的方法来对一组电子邮件地址进行排序,以避免在C#中具有相同域的项是连续的。
I'm looking for an efficient way of sorting an array of email addresses to avoid items with the same domain to be consecutive, in C#.
内部的电子邮件地址
示例:
给出一个包含以下内容的数组:以下条目:
Given an array with the following entries:
[email protected]
[email protected]
[email protected]
[email protected]
我想获得类似于以下内容:
I would like to obtain something similar to the following:
[email protected]
[email protected]
[email protected]
[email protected]
推荐答案
借助扩展方法(从窃取) ,您可以这样操作:
With the help of an extension method (stolen from https://stackoverflow.com/a/27533369/172769), you can go like this:
List<string> emails = new List<string>();
emails.Add("[email protected]");
emails.Add("[email protected]");
emails.Add("[email protected]");
emails.Add("[email protected]");
var q = emails.GroupBy(m => m.Split('@')[1]).Select(g => new List<string>(g)).Interleave();
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>
,然后交织这些列表。
So basically, we create groups based on the domain part of the email adresses, project (or Select) each group into a List<string>
, and then "Interleave" those lists.
我已经对您的样本数据进行了测试,但是可能需要更彻底的测试才能发现边缘情况。
I have tested against your sample data, but more thorough testing might be needed to find edge cases.
欢呼声
这篇关于交织一系列电子邮件地址,避免具有相同域的项连续的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!