我有一些不寻常的事情要做。我想知道是否有人能想到一个简单的 进行我需要的更改的方法。我有一个
public class Report
{
public string[] Text { get; set; }
public string[] Image { get; set; }
public string[] Explanation { get; set; }
}
报表类可以有任意数量的文本、图像和解释,每个数组的大小总是一致的,但对于每个报表实例可能不同。
我需要做的是能够以随机顺序对数组元素进行排序。所以例如我可能有
Report.Text[0] = "text0";
Report.Text[1] = "text1";
Report.Text[2] = "text2";
Report.Image[0] = "img0";
Report.Image[1] = "img1";
Report.Image[2] = "img2";
Report.Explanation[0] = "exp0";
Report.Explanation[1] = "exp1";
Report.Explanation[2] = "exp2";
排序后
Report.Text[0] = "text2";
Report.Text[1] = "text0";
Report.Text[2] = "text1";
Report.Image[0] = "img2";
Report.Image[1] = "img0";
Report.Image[2] = "img1";
Report.Explanation[0] = "exp2";
Report.Explanation[1] = "exp0";
Report.Explanation[2] = "exp1";
谁能想出一个简单的方法来做到这一点?我能想到的就是我需要创建一个 相同大小的新临时对象并进行某种交换。但我不确定如何 随机化。我问的原因是为了以防万一过去有人有这种需求。
最佳答案
我强烈建议您重构它以创建一个类来封装 { Text, Image, Explanation }
元组。到那时,代码将更清晰,重新排序值将变得微不足道。哎呀,你可能甚至不需要 Report
在那个时候输入...你可能只能得到一个List<ReportItem>
管他呢。你只需要一个单独的 Report
如果您想添加额外的行为或数据以将事物联系在一起,请键入。
(顺便说一句,我希望你真的没有公共(public)领域来让这些开始......)
如果您那么有关于洗牌单个集合的问题,一个修改过的Fisher-Yates shuffle可能是最简单的方法。您也可以对多个数组执行此操作,但这不是很好 - 并且必须特定于 Report
... 而您可以根据 IList<T>
轻松编写通用 Fisher-Yates 实现.如果您在 Stack Overflow 上搜索,您应该能够轻松找到一些现有的实现 :)
关于c# - 如何洗牌多个相关数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6331455/