我想将多个列表(数量可变)排序为单个列表,但保持特定顺序。例如:
List A: { 1,2,3,4,5 }
List B: { 6,7,8 }
List C: { 9,10,11,12 }
Result List: { 1,6,9,2,7,10,3,8,11,4,12,5 }
我唯一的想法是从每个列表中删除第一个元素并将其放入结果集中(并重复直到所有列表都为空),但也许有更好的方法不需要创建每个元素的副本列表并且不会影响原始列表?
最佳答案
我建议使用 IEnumerator<T>
在有项目时枚举列表:
private static IEnumerable<T> Merge<T>(params IEnumerable<T>[] sources) {
List<IEnumerator<T>> enums = sources
.Select(source => source.GetEnumerator())
.ToList();
try {
while (enums.Any()) {
for (int i = 0; i < enums.Count;)
if (enums[i].MoveNext()) {
yield return enums[i].Current;
i += 1;
}
else {
// exhausted, let's remove enumerator
enums[i].Dispose();
enums.RemoveAt(i);
}
}
}
finally {
foreach (var en in enums)
en.Dispose();
}
}
测试
List<int> A = new List<int>() { 1, 2, 3, 4, 5 };
List<int> B = new List<int>() { 6, 7, 8 };
List<int> C = new List<int>() { 9, 10, 11, 12 };
var result = Merge(A, B, C)
.ToList();
Console.Write(string.Join(", ", result));
结果是
1, 6, 9, 2, 7, 10, 3, 8, 11, 4, 12, 5
关于c# - 合并多个列表,每个列表的可变长度为 "popping"个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40768322/