合并多个列表,每个列表具有可变长度的"弹出"元素

Mar*_*ark 3 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 }
Run Code Online (Sandbox Code Playgroud)

我得到的唯一想法是从每个列表中删除第一个元素并将其放入结果集(并重复直到所有列表都为空),但也许有更好的方法不需要创建每个列表的副本并且不也不会影响原始列表?

Dmi*_*nko 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

测试

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));
Run Code Online (Sandbox Code Playgroud)

结果是

1, 6, 9, 2, 7, 10, 3, 8, 11, 4, 12, 5
Run Code Online (Sandbox Code Playgroud)