-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つずつオフになっているため-1、インデックスの計算に注意してください)
  • 下の各要素インデックスに対して toTranspose、対応するグループからソース要素を取得し、 で変換を適用しremapます。
  • 最後Concatに残り。

ノート:

  • 必要に応じて、カスタム変換またはインライン転置を簡単に提供できます。
  • 要素が存在しない位置に移動する必要があるため、最後の部分グループに変換を適用できません。
于 2013-03-22T04:04:45.313 に答える