如何改组多个相关数组?

Jen*_*r82 1 c# c#-4.0

我有一些不寻常的事情需要做.我想知道是否有人能想出一个简单的方法来进行我需要的改变.我拥有的是一个

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)

谁能想到一个简单的方法呢?我能想到的是,我需要创建一个相同大小的新临时对象并进行某种交换.但我不确定如何随机化.我问的原因是为了防止过去有人有这种需要.

Jon*_*eet 5

强烈建议你重构这个来创建一个单独的类来封装{ Text, Image, Explanation }元组.此时,代码将更清晰,重新排序值将是微不足道的.哎呀,你可能甚至不需要Report那种类型......你可能只能拥有一种List<ReportItem>或其他什么.Report如果您想添加额外的行为或数据以将事物联系在一起,则只需要一个单独的类型.

(顺便说一句,我希望你们真的没有这些公共领域开始......)

如果你有洗牌周围的单一集合的问题,修改费雪耶茨洗牌可能是最简单的方法.您也可以使用多个数组执行此操作,但它不会很好 - 并且必须特定于Report...而您可以轻松编写基于的泛型 Fisher-Yates实现IList<T>.如果您搜索Stack Overflow,您应该可以轻松找到一些现有的实现:)

  • @Adrian:我假设基于给出的样本.每当你有几个集合在一个类中总是相同的长度时,警报响铃应响起. (2认同)