-1

我有一系列按以下顺序打印到 pdf 的项目。让我们说例如:

lines = {1, 2, 3, 
         4, 5, 6, 
         7, 8, 9, 
         10}

是我的数组的内容。

但是我想将数组中项目的顺序更改为

  {1, 4, 7,
   2, 5, 8, 
   3, 6, 9, 
   10}

然后我将此数组传递给我的打印引擎。基本上如果数组中有超过 3 个项目,我的新代码应该重新排序。

有人可以帮我弄清楚其中的逻辑。

谢谢

4

2 回答 2

4

按行索引的模数和行数对行进行排序。

public static ICollection<T> Sort<T>(ICollection<T> lines, int columns)
{
    var rows = lines.Count/columns;
    if (rows == 0)
    {
        return lines;
    }
    return lines.Select((line, i) => new {line, i})
                .OrderBy(item => item.i < columns*rows ? item.i%rows : rows)
                .Select(item => item.line)
                .ToList();
}

编辑:或者,您可以使用迭代器方法和列表的索引器而不是 LINQ:

public static IEnumerable<T> Sort<T>(IList<T> lines, int columns)
{
    var rows = lines.Count/columns;
    for (var i = 0; i < lines.Count; i++)
    {
        var index = rows > 0 && i < columns*rows
            ? (i%columns)*rows + i/columns
            : i;
        yield return lines[index];
    }
}
于 2013-03-22T04:20:44.420 回答
0

假设“对于线性数组,假设每 9 个元素形成 3x3 矩阵转置每个子序列,保持余数不变”:

// assuming T[] items;
var toTranspose = (items.Count() / 9) * 9;
var remap = new int[]{1, 4, 7, 2, 5, 8, 3, 6, 9 };

var result = Enumerable.Range(0, toTranspose)
  .Select(pos => items[(pos / 9) * 9 + (remap[pos % 9] - 1)])
  .Concat(items.Skip(toTranspose)
  .ToArray();

代码摘要:

  • 获取需要移动的项目数(即 9 个项目的组数int numberOfGroup = Count()/9;,乘以组大小)
  • 在数组中进行自定义转换(请注意,索引按原样从样本中复制,实际上是在计算索引中remap逐一复制的)-1
  • toTranspose对于从相应组中获取源元素并应用转换的每个元素索引 remap
  • 最后Concat剩下的。

笔记:

  • 如果需要,可以轻松提供自定义转换或内联转置。
  • 不能将转换应用于最后一个部分组,因为元素必须转到不存在的位置。
于 2013-03-22T04:04:45.313 回答