前提・実現したいこと
下記のような2次元配列があったとして、
C#
1 2 var cells = new int[,] 3 { 4 { 0, 0, 0}, 5 { 0, 0, 0}, 6 { 1, 1, 0}, 7 { 0, 0, 0}, 8 { 1, 1 1}, 9 };
この要素の配列の中で、最後に見つかった全て0の要素で埋まっている配列の1次元目のインデックスを
LINQで取得する方法のご教示をお願い致します。
C#
1 var cells = new int[,] 2 { 3 { 0, 0, 0}, //0で埋まっているけど最後に見つかっていない。 4 { 0, 0, 0}, //0で埋まっているけど最後に見つかっていない。 5 { 1, 1, 0}, 6 { 0, 0, 0}, //最後に見つかった0で埋まっている配列要素。この1次元目のインデックス:3 7 { 1, 1 1} 8 };
今回の例ですと、インデックス3を取得したいです。
ただし、下記のように条件に合う配列要素がなかった場合は、-1を取得するようにしたいです。
C#
1 var cells = new int[,] 2 { 3 { 1, 0, 0}, //0で埋まっていない。 4 { 0, 1, 0}, //0で埋まっていない。 5 { 1, 1, 0}, //0で埋まっていない。 6 { 0, 0, 1}, //0で埋まっていない。 7 { 1, 1 1} //0で埋まっていない。 8 };
試したこと
C#
1 2 int[,] cells = new int[,] 3 { 4 { 0, 0, 0}, 5 { 0, 0, 0}, 6 { 1, 1, 0}, 7 { 0, 0, 0}, 8 { 1, 1, 1} 9 }; 10 11 var comparison = new int[] { 0, 0, 0 }; 12 13 int lastIndex = Enumerable 14 .Range(0, cells.GetLength(0)) 15 .Select(a => Enumerable 16 .Range(0, cells.GetLength(1)) 17 .Select(b => cells[a, b])) 18 .Select((a, i) => a.SequenceEqual(comparison) ? i : -1) 19 .Last(a => a != -1); 20 21 Debug.Log(lastIndex); //3
この場合はインデックス3がとれますが、
条件に合わない場合(2次元配列cellsの要素に0で埋まっている配列がない場合)、
-1を返すようにする方法がわかりません。
調べたのですが、
DefaultIfEmptyというものがあるらしいですが、これは配列やリストで返すみたいなので、
できなさそうだと思いました。
また、LastOrDefaultだと既定値の0が返ってきてしまうので、これもできないと思いました。
あと、最後から2行目、
C#
1.Select((a, i) => a.SequenceEqual(comparison) ? i : -1)
の記述ですが、もしかしたら、ここはSelectじゃなく、Lastとか使って、
もっとLINQを短くすることができるかもしれないと思い、考えたのですが、わかりませんでした。
このSelectの箇所をLastとか使って短くすることは可能ですか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/03 23:26
2019/02/04 00:15 編集
2019/02/04 04:37
退会済みユーザー
2019/02/04 15:33
2019/02/04 15:38
退会済みユーザー
2019/02/05 14:19 編集
2019/02/05 14:24
2019/02/05 14:27
退会済みユーザー
2019/02/06 17:06
2019/02/06 22:26
2019/02/07 03:25 編集
2019/02/06 23:05
2019/02/07 00:15
2019/02/07 03:53 編集
2019/02/07 05:19
2019/02/07 05:46
退会済みユーザー
2019/02/07 16:23