c# - 以相同的方式打乱两个列表

标签 c# ienumerable shuffle

我想打乱两个列表,以便它们以相同的方式打乱(前提是我有一种方法 Shuffle(List list) 可以打乱一个列表。

List<ObjX> listA = new List<ObjX>() { A, B, C, D };
List<ObjX> listB = new List<ObjX>() { W, X, Y, Z };
ShuffleTwoLists(listA , listB )

结果:
A: C, B, D, A
B: Y, X, Z, W

有没有一种在 C# 中快速实现 ShuffleTwoLists(listA , listB) 的方法?

最佳答案

选项 1:压缩、随机播放、解压缩

扩展 Marcelo 的评论,并假设您不介意创建列表而不是打乱现有列表:

var zipped = listA.Zip(listB, (a, b) => new { a, b } ).ToList();
Shuffle(zipped);
var newListA = zipped.Select(pair => pair.a).ToList();
var newListB = zipped.Select(pair => pair.b).ToList();

选项 2:打乱索引

用代码扩展 MAK 的答案:

var indexes = Enumerable.Range(0, listA.Count).ToList();
Shuffle(indexes);
var newListA = indexes.Select(index => listA[index]).ToList();
var newListB = indexes.Select(index => listB[index]).ToList();

当然,这两种方法都可以改变原始列表,但需要更多的工作。

选项 3:使用相同的随机种子打乱两个列表

我个人喜欢将 Random(或其他)传递给需要它们的方法/类,而不是创建新的。所以我会给我的 Shuffle 一个 Random 参数。它避免了各种问题,并且很好地表达了依赖关系。您可以通过创建两个具有相同种子的 Random 实例来利用它:

int seed = existingRandom.Next();
Shuffle(listA, new Random(seed));
Shuffle(listB, new Random(seed));

假设 Shuffle 在给定相同的随机数序列时做同样的事情,这将以相同的方式打乱两个列表。

关于c# - 以相同的方式打乱两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711708/

相关文章:

java - 在 Java 中没有重复且随机顺序的集合

c# - 使用节省空间的 xml 在 C# 中实现 xmlserializable 字典

c# - 在 AUTOFAC 中对同一接口(interface)使用不同的 JSON 配置文件

c# - 如何将 Field<T> 与类型一起使用?

c# - 为什么 SemaphoreSlim.WaitAsync 不起作用?它在 GetAccesTokenAsync 调用完成之前跳转到 "return currentToken.AccessToken"

c# - 将 DataRowCollection 转换为 IEnumerable<T>

javascript - 如何打乱 JavaScript 数组?

c# - 自定义 IEnumerable 实现无法使用 IEnumerable 进行设置

c# - 从 IEnumerable C# 返回列表<object>

javascript - 随机化数组中的对象