我有一些不寻常的事情需要做.我想知道是否有人能想出一个简单的方法来进行我需要的改变.我拥有的是一个
public class Report
{
public string[] Text { get; set; }
public string[] Image { get; set; }
public string[] Explanation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
报告类可以包含任意数量的文本,图像和说明,每个数组的大小始终是一致的,但每个报告实例可能不同.
我需要做的是能够以随机顺序对数组元素进行排序.例如,我可能有
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";
Run Code Online (Sandbox Code Playgroud)
然后排序
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";
Run Code Online (Sandbox Code Playgroud)
谁能想到一个简单的方法呢?我能想到的是,我需要创建一个相同大小的新临时对象并进行某种交换.但我不确定如何随机化.我问的原因是为了防止过去有人有这种需要.
我强烈建议你重构这个来创建一个单独的类来封装{ Text, Image, Explanation }元组.此时,代码将更清晰,重新排序值将是微不足道的.哎呀,你可能甚至不需要Report那种类型......你可能只能拥有一种List<ReportItem>或其他什么.Report如果您想添加额外的行为或数据以将事物联系在一起,则只需要一个单独的类型.
(顺便说一句,我希望你们真的没有这些公共领域开始......)
如果你再有洗牌周围的单一集合的问题,修改费雪耶茨洗牌可能是最简单的方法.您也可以使用多个数组执行此操作,但它不会很好 - 并且必须特定于Report...而您可以轻松编写基于的泛型 Fisher-Yates实现IList<T>.如果您搜索Stack Overflow,您应该可以轻松找到一些现有的实现:)