- PR -

foreach の変数は読み取り専用なんですか?

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-10 15:42
え??? 繰り返しになりますが、

foreach ステートメントは、取り出して参照することが目的です。
http://msdn2.microsoft.com/ja-jp/library/ttw7t8t6.aspx

一郎さんの仰るとおり、普通に for ステートメントを使うべきです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-10 15:50
引用:

R・田中一郎さんの書き込み (2006-08-10 15:22) より:

List<string> programCodeの全要素を "aaa" で埋めたいという前提の話です。
本当に "aaa" で埋まると勿論困る訳ですが。


Ω ΩΩ<ナ、ナンダッテェー!!

どうやら私は勘違いをしていたようですね。
てっきり列挙したものを条件によって書き換えたいのだが、列挙した s が読
み取り専用なので以下略。という話だと思っていました。
んー、だとするとじゃんぬねっとさんや mio さんと同じ意見ですかね。

あ、ちょっと目を放している隙にスレが進んでいる orz
全部変更する(埋める)のであれば、やはり一郎さん案になるでしょうか。

ちなみに特定した場合でも、中身を変更することでリスト(の並び)が変更さ
れてしまうので、foreach 中では変更できないという風に解釈しています。
(って、これもまどかさんとカブった orz)
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-10 15:53
引用:

ぽぴ王子さんの書き込み (2006-08-10 15:23) より:

久しぶりにR・田中一郎さんのこだわりスレがっ!



引用:

じゃんぬねっとさんの書き込み (2006-08-10 15:29) より:

foreach で、この処理はナンセンスですね。

foreach の本来の強みは何だと思いますか?
for に置き換えることができるのにも関わらず、なぜ必要だと考えていますか?
開発者のタイプを減らすためだけだと考えていませんか?



>ぽぴ王子さん、じゃんぬねっとさん。
う〜む、そんな大それたものではなくてですね^^;
perl だと、書けるので、.net で駄目と言われて、じゃあ皆さん素直に案1を使っていらっしゃるのかと気になっただけなのです。

一郎さん、まどかさんの仰るとおり、何故できないのか?、と考えもしたのですが。
foreach はコレクション中の1要素の参照を、そのブロック内で利用できる便利な機能、という認識なのです。
なので、サンプルの処理もアリなのかな〜、なんて思ったのですが、string は代入だから、その後に値を変更してもコレクション側に反映されないってことなんでしょうか?

引用:

mioさんの書き込み (2006-08-10 15:29) より:

というわけで、私もぽぴ王子さんの案(2)でやると思います。


そうですね。この2案の発想は浮かびませんでした。>ぽぴ王子さんありがとうございます。
ボクもぽぴ王子さん2案方式を元にしてやろうと思います。

#でも純粋にボクのサンプルのようなことができたら、とても便利だと思ふ訳だが。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-08-10 15:58
引用:

え??? 繰り返しになりますが、

foreach ステートメントは、取り出して参照することが目的です。
http://msdn2.microsoft.com/ja-jp/library/ttw7t8t6.aspx


うぅ、私のクラスメンバを変更する例に対してだと思うのですが
確かに変更しないでくださいと書いてありますね。(はじめてみました)

今まで、当然ながら、
「列挙が不定である」「そのものを変更なんかはしない」「コレクションメンバ間に関連の無い処理」
という前提で普通にやってます。
これをやるべきでないと言われると
コード:
For Each c As ColumnHeader In ListView1.Columns
    c.Width = -1
Next


もForステートメントにしろということでしょうか?
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-08-10 15:59
引用:

R・田中一郎さんの書き込み (2006-08-10 15:53) より:

#でも純粋にボクのサンプルのようなことができたら、とても便利だと思ふ訳だが。


もし仮にできた場合、意図せずやってしまった場合に恐ろしいことになると思うのは僕だけでしょうか・・・
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-10 15:59
とか書いていたら、更にスレが伸びていますね。

じゃんぬ師匠が参照で使うべきだと仰っています。
ぽぴ王子さんも同意権のやうです・・・

ひょっとして良い方法があるのか?、と思ったのですが、皆さん for で回しているようなので、僕も素直にそうすることにします。

皆さんありがとうございました。
未記入
常連さん
会議室デビュー日: 2005/07/04
投稿数: 31
投稿日時: 2006-08-10 16:05
引用:

これをやるべきでないと言われると
コード:
--------------------------------------------------------------------------------

For Each c As ColumnHeader In ListView1.Columns
c.Width = -1
Next


--------------------------------------------------------------------------------


もForステートメントにしろということでしょうか?



そんなことはないでしょう。

>予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。

であって、取得した要素の内容の変更については特に言及されていませんし。

おそらく、

コード:
List<string> ls;
...
foreach(string s in ls){
 if(s=="hoge")ls.clear();
}



とか、そんなことを想定しているんじゃないでしょうか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-10 16:06
>まどかさん、ひろれいさん。

ボクも、まどかさんと同じように、参照とした考え方が前提でいたのです。

コード:
List<僕> 僕達;

private void 例() {
    for (int i = 0; i < this.僕達.Count; i++) {
        僕 s = this.僕達[i];
        s.名前 = "僕の名前はR・田中一郎くんだよ。";
    }
}



これを、

コード:
private void 例() {
    foreach (僕 s in this.僕達) {
        s.名前 = "僕の名前はR・田中一郎くんだよ。";
    }
}



こう書くのと大差ないかな〜、という認識なのです。

スキルアップ/キャリアアップ(JOB@IT)