やりたいこと
掲題の通り、foreach内で最後の要素だった場合処理を行うようにしたいのですが、やり方がわかりません。
機密情報でコードを載せることができないので簡単にイメージを書かせていただきます。
hogeはList<Model>型で、itemはModel型です。
C#
1 foreach (var item in hoge) 2 { 3 if (item == "hoge") 4 { 5 Console.WritLine(item); 6 } 7 else if(最後の要素であればtrue) //ここにあたるもの 8 { 9 Console.WritLine(item); 10 } 11 }
情報が少ないですが、もしご存じでしたらご教授お願い致します。
環境:
windows10 64bit
visual studio 2019
ASP.NET webアプリケーション MVC
.NET Framework 4.7.2
> foreach内で最後の要素だった場合処理を行うようにしたい
その「最後の要素」の定義を教えて下さい。foreach ループの中で処理される最後の item でいいのか (どの Model が最後に item に代入されるかは不定)、List<Model> オブジェクトの中の特定の Model なのか。
ASP.NET MVC アプリのようですが、もし Controller とか View が関係するならその辺りを含めたサンプルコードを提示した方がよさそうです。
もちろん「機密情報」なしで結構ですので、全体が分かるサンプルにしていただければと。
Listに格納されている最後のModelを検証する場合
、、という答えで合っているでしょうか。
全体となると時間がかかりそうなので、もし頂いた回答で解決しなければ作成いたします。
申し訳ございません。
サンプル以前に、その前のコメントに返答ください。
すいません、頂いた2つのコメントに返答したつもりでした。
一つ目のコメントに関しまして、返答を少し細かくするとModel要素が10個格納されているListだとしたら、
10番目のModelだった場合に処理をしたいです。
> 10番目のModelだった場合
List<Model> に 10 番目に Add した Model だったとしても、foreach ループの 10 番目に item に代入される保証はないと思うのですが・・・
対象は固定しておらず、仮に要素が10あるとしたらList[9]の時にtrueにしたいということです。
Listは要素の順序が保証されているかつ、List.Addはコレクションの末尾に追加であり、foreachのスコープ内の繰り返し変数は再割り当て不可なので、foreach の 10 ループ目にコレクションの 10 番目の要素以外が入ることはないかと思われます。(恐らく)
> 対象は固定しておらず、仮に要素が10あるとしたらList[9]の時にtrueにしたいということです。
List<Model> の中身の Model に関係なく、foreach ループの中で List<Model> の最後の要素を判定したいと理解しました。お騒がせしてすみませんでした。
BlueOxy さん>
foreach (T item in List<T>) ループの中で T の順番がどうなるかはいろいろ議論があるようですが、インデックスの順番になるのは間違いないようです。ただ、インデックスが List<T> に T を Add した順番になるのかどうかは Microsoft の公式文書には自分は見つけられませんでした(もちろん途中で Remove とか Insert とかしないという条件で)。そのあたりご存じでしたら教えていただけると幸いです。
> インデックスが List<T> に T を Add した順番になるのかどうか
Insertの引数に渡すindexがList<T>.Countと同じときは末尾に追加されると書いてありますので、AddしたときはList<T>.Countと同じインデックスに要素が追加されると思います。
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.insert?view=net-5.0
マルチスレッドのような環境は例外として(そもそもListはスレッドセーフではないため)、シングルスレッドで同期的にAddを呼び出した場合はその順番通りにインデックスがAddしたそれぞれの要素へ割り振られると思います。
公式文書…とは少し違いますが、Reference Sourceでもそのような実装は確認できます。
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,220
> _items[_size++] = item;
回答3件
あなたの回答
tips
プレビュー