ありがとうございます。 この場合、グリッドの場合、考えられる唯一のキーは、グリッドの行/列のインデックスに基づく計算の結果です。 私がプレーンテキストで選んだ計算を説明するのはちょっと難しいので、以下の例が私の話をすることを願っています。
これはあなたの質問にお答えしますか?
テストデータ/設定
var grid = new List<List<string>>();
grid.Add(new List<string>(new[] { "0,0", "1,0", "2,0", "3,0", "4,0" }));
grid.Add(new List<string>(new[] { "0,1", "1,1", "2,1", "3,1", "4,1" }));
grid.Add(new List<string>(new[] { "0,2", "1,2", "2,2", "3,2", "4,2" }));
grid.Add(new List<string>(new[] { "0,3", "1,3", "2,3", "3,3", "4,3" }));
grid.Add(new List<string>(new[] { "0,4", "1,4", "2,4", "3,4", "4,4" }));
// Quadratic group factor.
int n = 2;
ソリューション1 - ラムダ式
var result_1 = grid
// Create quadratic groups by calculating the combined index of the row+column with the quadratic group factor.
.SelectMany(r =>
r.GroupBy(c =>
(int)Math.Floor((double)grid.IndexOf(r)/(double)n)
+ "_" +
(int)Math.Floor((double)r.IndexOf(c)/(double)n)
)
)
// Combine all same keys together in one group.
.GroupBy(g => g.Key)
// Get all results per group.
.Select(gg => gg.SelectMany(g => g).ToList())
// ToList() because it's easier to inspect the value of the result while debugging.
.ToList();
// Short version:
var result_2 = grid
.SelectMany(r =>
r.GroupBy(c =>
(int)Math.Floor((double)grid.IndexOf(r)/(double)n) + "_" + (int)Math.Floor((double)r.IndexOf(c)/(double)n)
)
)
.GroupBy(g => g.Key)
.Select(gg => gg.SelectMany(g => g).ToList())
.ToList();
ソリューション2 - オールドスクールループ、理解することは、より良い/おそらく容易になります。
var result_3 = new List<List<string>>();
// Range (amount of both 'rows' and 'columns' since it's a grid).
int range = (int)Math.Ceiling((double)grid.Count/(double)n);
// Loop through 'rows'.
for(var y = 0; y < range; y++)
{
int skipRowsAmount = (y * n);
int takeRowsAmount = n;
// Get all 'rows' to split in groups.
var rows = grid.Skip(skipRowsAmount).Take(takeRowsAmount).ToList();
// Loop through 'columns'.
for (var x = 0; x < range; x++)
{
int skipColumnsAmount = (x * n);
int takeColumnsAmount = n;
// Get all 'columns' from all 'rows' to split in groups.
var quadraticColumns = rows.SelectMany(l => l.Skip(skipColumnsAmount).Take(takeColumnsAmount)).ToList();
// Add the quadratic columns group to the result.
result_3.Add(quadraticColumns);
}
}
編集 - コード私は達成するために何を望むかについては
.SelectMany(r =>
r.GroupBy(c =>
(((int)Math.Floor((double)grid.IndexOf(r)/(double)n)) * ((int)Math.Ceiling((double)grid.Count/(double)n)))
+
(int)Math.Floor((double)r.IndexOf(c)/(double)n)
)
)
を整数に文字列からグループキーを変更するには、あなたの最初のソリューションは、非常によくあなたに感謝を働きました!それにもかかわらず、文字列をキーとして使用しました。それを整数に変換して、まったく同じ方法で動作させる方法はありますか?前もって感謝します。 –
はい。たとえば、 "0_0"から "0"(int)のグループキーを数値計算で変更することができます。私は上記のメインポストに例を付けました。それは、グリッド内の各列のグループ番号を直接計算してグループ化します。 – Richard