🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

20572閲覧

foreachループ内で、最後の要素だった場合処理をしたい

sad

総合スコア16

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/12/22 06:10

やりたいこと

掲題の通り、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/22 06:40 編集

> foreach内で最後の要素だった場合処理を行うようにしたい その「最後の要素」の定義を教えて下さい。foreach ループの中で処理される最後の item でいいのか (どの Model が最後に item に代入されるかは不定)、List<Model> オブジェクトの中の特定の Model なのか。
退会済みユーザー

退会済みユーザー

2020/12/22 06:34

ASP.NET MVC アプリのようですが、もし Controller とか View が関係するならその辺りを含めたサンプルコードを提示した方がよさそうです。 もちろん「機密情報」なしで結構ですので、全体が分かるサンプルにしていただければと。
sad

2020/12/22 06:38

Listに格納されている最後のModelを検証する場合 、、という答えで合っているでしょうか。 全体となると時間がかかりそうなので、もし頂いた回答で解決しなければ作成いたします。 申し訳ございません。
退会済みユーザー

退会済みユーザー

2020/12/22 06:41

サンプル以前に、その前のコメントに返答ください。
sad

2020/12/22 06:46

すいません、頂いた2つのコメントに返答したつもりでした。 一つ目のコメントに関しまして、返答を少し細かくするとModel要素が10個格納されているListだとしたら、 10番目のModelだった場合に処理をしたいです。
退会済みユーザー

退会済みユーザー

2020/12/22 06:54

> 10番目のModelだった場合 List<Model> に 10 番目に Add した Model だったとしても、foreach ループの 10 番目に item に代入される保証はないと思うのですが・・・
sad

2020/12/22 06:56

対象は固定しておらず、仮に要素が10あるとしたらList[9]の時にtrueにしたいということです。
BluOxy

2020/12/22 07:06 編集

Listは要素の順序が保証されているかつ、List.Addはコレクションの末尾に追加であり、foreachのスコープ内の繰り返し変数は再割り当て不可なので、foreach の 10 ループ目にコレクションの 10 番目の要素以外が入ることはないかと思われます。(恐らく)
退会済みユーザー

退会済みユーザー

2020/12/22 08:47 編集

> 対象は固定しておらず、仮に要素が10あるとしたらList[9]の時にtrueにしたいということです。 List<Model> の中身の Model に関係なく、foreach ループの中で List<Model> の最後の要素を判定したいと理解しました。お騒がせしてすみませんでした。
退会済みユーザー

退会済みユーザー

2020/12/22 09:08

BlueOxy さん> foreach (T item in List<T>) ループの中で T の順番がどうなるかはいろいろ議論があるようですが、インデックスの順番になるのは間違いないようです。ただ、インデックスが List<T> に T を Add した順番になるのかどうかは Microsoft の公式文書には自分は見つけられませんでした(もちろん途中で Remove とか Insert とかしないという条件で)。そのあたりご存じでしたら教えていただけると幸いです。
BluOxy

2020/12/27 20:58 編集

> インデックスが 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;
guest

回答3

0

ベストアンサー

LINQを使ってください。
Enumerable.Select メソッド

C#

1foreach(var item in hoge.Select((x,i) => new { Index = i, Value = x})) 2{ 3 if(item.Value == "hoge") 4 { 5 Console.WriteLine (item.Value); 6 } 7 else if(item.Index == hoge.Count() - 1) 8 { 9 Console.WriteLine (item.Value); 10 } 11}

Selectメソッドで添え字付きの匿名型に射影し、実現しています。


そもそも、掲示されたコードではforeachループ内で処理する必要がなさそうなので、下記で良いように思います。
Enumerable.Last メソッド

C#

1foreach(var item in hoge) 2{ 3 Console.WriteLine(item); 4} 5 6var last = hoge.Last(); 7Console.WriteLine (last); 8//TODO: 最後の要素のときに行いたい処理を記述

投稿2020/12/22 06:15

編集2020/12/22 06:36
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/12/22 06:17

(foreachループ内 とのことなのでちょっと書き直し…)
BluOxy

2020/12/22 06:40 編集

後者の方法を使う場合、かつhogeの要素が空になるケースが存在する場合はLastOrDefaultメソッドを使うことも検討してください。
sad

2020/12/22 06:59

LinQがなんなのか、どういう原理で動いてるのかよくわかっておりませんが、無事動かすことができました。 二番目の回答につきましても、簡単なのでこれから生かせそうです。 ありがとうございました。
BluOxy

2020/12/22 07:21 編集

LINQ (細かいですが全て大文字です) については、下記辺りで詳しく解説されています。 https://ufcpp.net/study/csharp/sp3_linq.html https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/working-with-linq 一言でLINQが何かを伝えるなら「コレクションをお料理するための関数ライブラリ」と思っています。 今回はhogeという料理に添え字という調味料を入れただけです。 (例えはあまり鵜呑みにはせず、3%ぐらい参考にしてください)
guest

0

C#

1var last = hoge.Last(); 2foreach (var item in hoge) 3{ 4 if (item.Equals(last)) 5 { 6 //最終要素 7 } 8}

投稿2020/12/22 06:22

編集2020/12/22 06:24
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/12/22 06:34 編集

Equals()をオーバーライドして、要素に重複があったときに困りません?
SHOMI

2020/12/22 06:57

あ、そうですね…
guest

0

C#

1 HOGE item; 2 foreach (item in hoge){ 3 なんたら; 4 } 5 なんかの処理(item);

とか。

投稿2020/12/22 06:19

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/12/22 06:36

おお、なるほど。 ご指摘ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問