从c#的主列表中创建多个唯一条目的列表
本文关键字:列表 唯一 一条 创建 | 更新日期: 2023-09-27 18:11:37
我需要处理出站短信队列并创建批量消息。排队列表可能包含发给同一个人的多条消息。批处理不允许这样做,所以我需要运行主出站队列并创建尽可能多的批处理,以确保它们包含唯一的条目。例子:
Outbound queue = (1,2,3,3,4,5,6,7,7,7,8,8,8,8,9)
结果……
batch 1 = (1,2,3,4,5,6,7,8,9)
batch 2 = (3,7,8)
batch 3 = (7,8)
batch 4 = (8)
我可以很容易地检查重复,但我正在寻找一种灵活的方式来生成额外的批次。
谢谢!
看一下使用Enumerable.ToLookup
和其他LINQ方法的方法:
var queues = new int[] { 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8, 8, 8, 9 };
var lookup = queues.ToLookup(i => i);
int maxCount = lookup.Max(g => g.Count());
List<List<int>> allbatches = Enumerable.Range(1, maxCount)
.Select(count => lookup.Where(x => x.Count() >= count).Select(x => x.Key).ToList())
.ToList();
结果是包含其他四个List<int>
的列表:
foreach (List<int> list in allbatches)
Console.WriteLine(string.Join(",", list));
1, 2, 3, 4, 5, 6, 7, 8, 9
3, 7, 8
8
8
根据所使用的具体数据结构,可以使用Linq GroupBy扩展方法(如果队列对某些类型的T
实现IEnumerable<T>
)对同一用户进行分组;之后,可以分别迭代组
一种简单的方法是遍历输入,创建并填充批:
private static List<List<int>> CreateUniqueBatches(List<int> source)
{
var batches = new List<List<int>>();
int currentBatch = 0;
foreach (var i in source)
{
// Find the index for the batch that can contain the number `i`
while (currentBatch < batches.Count && batches[currentBatch].Contains(i))
{
currentBatch++;
}
if (currentBatch == batches.Count)
{
batches.Add(new List<int>());
}
batches[currentBatch].Add(i);
currentBatch = 0;
}
return batches;
}
输出:1, 2, 3, 4, 5, 6, 7, 8, 9
3, 7, 8
8
8
我相信这可以缩短或写在一个功能的方式。我试过GroupBy、Distinct和Except,但没能这么快弄明白。