如何将2个已排序的列表合并到一个混洗列表中,同时在c#中保持内部顺序

我想要一个混乱的合并列表,它将保持列表的内部顺序。

例如:

清单A:11 22 33

清单B:6 7 8

有效结果: 11 22 6 33 7 8

结果无效:22 11 7 6 33 8

原答案:

static IEnumerable MergeShuffle(IEnumerable lista, IEnumerable listb) { var first = lista.GetEnumerator(); var second = listb.GetEnumerator(); var rand = new Random(); bool exhaustedA = false; bool exhaustedB = false; while (!(exhaustedA && exhaustedB)) { bool found = false; if (!exhaustedB && (exhaustedA || rand.Next(0, 2) == 0)) { exhaustedB = !(found = second.MoveNext()); if (found) yield return second.Current; } if (!found && !exhaustedA) { exhaustedA = !(found = first.MoveNext()); if (found) yield return first.Current; } } } 

第二个答案基于marcog的答案

  static IEnumerable MergeShuffle(IEnumerable lista, IEnumerable listb) { int total = lista.Count() + listb.Count(); var random = new Random(); var indexes = Enumerable.Range(0, total-1) .OrderBy(_=>random.NextDouble()) .Take(lista.Count()) .OrderBy(x=>x) .ToList(); var first = lista.GetEnumerator(); var second = listb.GetEnumerator(); for (int i = 0; i < total; i++) if (indexes.Contains(i)) { first.MoveNext(); yield return first.Current; } else { second.MoveNext(); yield return second.Current; } } 

只需随机选择一个列表(例如,生成0到1之间的随机数,如果<0.5列表A,否则列出B),然后从该列表中取出该元素并将其添加到新列表中。 重复,直到每个列表中没有剩余元素。

在区间[0, B.Length ]中生成A.Length随机整数。 对随机数进行排序,然后从0 … 0..A.Length迭代i ,将A[i]加到B位置r[i]+i中。 +i是因为当您从A插入值时,您将B的原始值向右移动。

这将与您的RNG一样随机。

只需遍历两个列表,同时随机选择要从中挑选项目的列表。 然后将它们粘贴到另一个列表中 这是一种方法:

 static IEnumerable Shuffle(IEnumerable listB, IEnumerable listA) { var rng = new Random(); var lists = new[] { new Queue(listA), new Queue(listB) }; while (lists.Any(l => l.Any())) { int i = rng.Next(2); var selected = lists[i]; if (!lists[i].Any()) selected = lists[1-i]; yield return selected.Dequeue(); } }