我有一个算法,我已经试着解决了很长一段时间.我正在与以下人员合作:

  • 我有一个"group"数组,它由六个元素组成,而且总是六个元素
  • 我有一个由3到16个元素组成的"细节"数组
  • 我有一个"矩阵"数组,表示一个包含12列8行的表

我的组数组可能如下所示(在C#中): string[] groups = new string[] { "1_1", "1_2", "1_3", "2_1", "2_2", "2_3" };

我的细节数组可能如下所示(在C#中): string[] details = Enumerable.Range(1, 16).Select(x => x.ToString()).ToArray();

我将列数和行数作为参数接收,然而,无论出于何种目的和目的,它总是分别为12x8.这意味着我有一个由96个元素组成的矩阵.我 Select 了以"列为主"的方式填充矩阵,因为我认为它会比其他方式更简单(但如果您认为以行为主的方式更好地工作,请分享!)所以,我有一个这样的模式:

12 by 8 matrix in column-major order

所需的模式如下:

required pattern

在每个单元格中,第一个数字表示"Groups"数组的索引,而第二个数字表示"Details"数组的索引.

归根结底,我想要的是这样的东西:

expected result

我提到过,"细节"数组可以只有3个元素.这意味着我的矩阵应该是这样的:

expected result with 3 detail elements

如果元素多于8个但少于16个,我不需要"换行".例如,如果"Details"数组中有10个元素,我的结果将如下所示:

expected result with 10 detail elements

我try 了各种方法来满足这些要求,但到目前为止,我还没有成功,包括for、Foreach和While循环(有时是嵌套的,有时不是),以及各种"映射"(例如使用词典辅助),或者试图从"Current Column"、"Current Row"和"Current Index"的某种组合以及对这些数字的操作(如除法、乘法和余数)中"推断"适当的索引.任何帮助都将不胜感激.(尤其是那些更动态、算法更简单的,但在这一点上我不能太挑剔!)

我一直在LINQPad上玩耍,所以一系列的声明是很棒的.然而,我并不介意用其他语言甚至伪代码进行回复.

推荐答案

您要查找的两个表达式是:

groupIndex = col / 6 * 3 + col % 3;
detailIndex = col % 6 / 3 * 8 + row;

其中/表示整数除法.

The group index depends only on the column number.
Dividing the column by 6 gives 0 0 0 0 0 0 1 1 1 1 1 1
Multiply by 3 to get 0 0 0 0 0 0 3 3 3 3 3 3
Then add the column number mod 3 to get 0 1 2 0 1 2 3 4 5 3 4 5

The expression for the detail index is similar.
The column number mod 6 is 0 1 2 3 4 5 0 1 2 3 4 5
Divide by 3 to get 0 0 0 1 1 1 0 0 0 1 1 1
Then multiply by 8 to get 0 0 0 8 8 8 0 0 0 8 8 8
Adding the row number results in the following detail indexes:

 0  0  0  8  8  8  0  0  0  8  8  8 
 1  1  1  9  9  9  1  1  1  9  9  9 
 2  2  2 10 10 10  2  2  2 10 10 10 
 3  3  3 11 11 11  3  3  3 11 11 11 
 4  4  4 12 12 12  4  4  4 12 12 12 
 5  5  5 13 13 13  5  5  5 13 13 13 
 6  6  6 14 14 14  6  6  6 14 14 14 
 7  7  7 15 15 15  7  7  7 15 15 15 

Csharp相关问答推荐

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

. NET WireMock拒绝PostAsJsonAsync序列化

.NET 8 Web-API返回空列表

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

使用带有WithAppOnly()请求选项的pageIterator

在允许溢出的情况下将小数转换为长

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

如何在NET 8最小API中自动记录TypedResults.Stream响应

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

如何管理Azure认证客户端响应和证书 fingerprint

带有列表参数的表达式树

委托RequestDelegate不带2个参数-ASP.NET Core 8最小API

VS 2022与VS 2019:如何/为什么创建额外的任务?

在集成测试中可以在模拟InMemory数据库中设定数据种子

如何使用EPPlus C#在单个单元格中可视化显示多行文字

毛伊岛.NET 8图片不再适合按钮

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

如何使ExecuteAsync异步运行