c# - 合并多个列表,每个列表的可变长度为 "popping"个元素

标签 c# sorting merge

我想将多个列表(数量可变)排序为单个列表,但保持特定顺序。例如:

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/

相关文章:

c# - XAML 中的颜色反转

c# - 为什么从另一个类访问时static int总是0

java - 有没有办法移动二维数组矩阵中的列?

python - 从偏好列表中找到可行的组合

javascript - 意外的数据绑定(bind)行为

java - 使用合并排序与选择排序的比较

当一个不存在的实体被传递给 merge() 时,Hibernate 意外地发出 INSERT 而不是抛出 javax.persistence.OptimisticLockException

c# - 如何验证 C# 中的消息框弹出窗口?

python - 如何在 pandas 中混合多个数据帧得到 ValueError

c# - 在 C# 中使用 HttpWebRequest/Response 登录网站?