c# - 如何洗牌多个相关数组?

标签 c# c#-4.0

我有一些不寻常的事情要做。我想知道是否有人能想到一个简单的 进行我需要的更改的方法。我有一个

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/

相关文章:

c# - 将 Lambda 表达式树与 IEnumerable 结合使用

c# - 适用于 Windows Phone 8 的 IsolatedStorageFile 或 Windows.Storage API?

C#4.0 : How to find out if types are co-variantly equal

c# - MS Chart ChartImageHandler 存储选项

wpf - 将 TextOptions.TextFormattingMode 与 FormattedText 结合使用

c# - Contract.Requires 不阻止空引用警告(紫色波浪形)

c# - Dicom 窗口宽度和级别公式未给出灰度值

c# - Windows 8.1 如何修复这个过时的代码?

c#-4.0 - 将 LEFT OUTER JOIN 转换为 Entity Framework

C# 2010 : Deploying Multiple Apps. 。需要 Sure Fire 方式来更新