日記
- 先週はほとんど駄目な感じだった.時間がないのに…
- 週末は大学の学園祭,グッドデザイン賞の展示,さらに都内で打合せ
- 学園祭
- 在学中の学園祭はこれで最後(の予定)なので,ちょっとだけ感慨深かった.一度だけ,二年生の時に出店側をやったのを思い出した
- 今年は二学期制へ移行のため,これまで三日間あったのが前夜祭+メイン2日という構成になっていた.前夜祭(初日)は15時から,限定された場所だけ,さらに天気も悪かったためなんだか残念に感じた
- グッドデザイン賞の展示
- 最終日とあってか(実際はそうでもないらしい),かなり人が多かった
- デザイナとして名前が載ってうれしい ;)
- 感想はまた追記する
- 2013/11/07
- LINQ では IEnumerable.Where, Select, … ができる
- さらに, List
.ForEach みたいなことができると,結構rubyで配列・ハッシュを操作しているときと同じような感じになる - そこで 10.times {} ができないかな,と考えたが結局ググった
using System; using System.Linq; using System.Collections; using System.Collections.Generic; namespace linqenumeratetrial { public static class Extensions { public static void Times( this int count, Action action ) { for (int i = 0; i < count; i++) { action (); } } public static void Times( this int count, Action<int> action ) { for (int i = 0; i < count; i++) { action (i); } } } class MainClass { public static void Main (string[] args) { var numbers = new List<int> (); 5.Times (() => { 5.Times (() => Console.WriteLine ("Hello, World")); 5.Times (i => numbers.Add (i)); }); numbers.ForEach (i => Console.WriteLine (i.ToString ())); Console.ReadKey (); } } }
- その他: なぜ IEnumerable
には ForEach が無いの?(LINQ equivalent of foreach for IEnumerable - StackOverflow.com )- IEnumerable に拡張メソッドを生やせばできるよ
- ない理由を考えるべきだ(List
をぶん回している間での副作用が心配) - “foreach” vs “ForEach” - Eric Lippert’s Blog - ちゃんと読んでないけど,ForEachはいろんな害の元になる,とある
- Where is List
.ForEach() - Metro style app(Win8向け?)ではList.ForEachが使えないらしい(でも .NET 4.5 では使える,変だと書いている人がいる)
- C# 5.0 以上では,forearch でぶん回している間に,List
の中身に副作用が発生してもエラーを出さなくなったよ
- collection の数を増やすメソッドを,ForEach,foreach の双方の中から呼び出してみた
public static void increseListSize( List<int> numbers ) { numbers.Add (100); }
- List
.ForEach
var numbers = new List<int> (); 5.Times (i => numbers.Add (i)); numbers.ForEach ( num => increseListSize( numbers ) );
=> 無限ループになってメモリを食いつぶし,System.OutOfMemoryException
- foreach
var numbers = new List<int> (); 5.Times (i => numbers.Add (i)); foreach (var num in numbers) { increseListSize (numbers); }
=> collection への変更を検知して,System.InvalidOperationException
(これは過去にも遭遇したことがある.C# 5.0 以降はこのメッセージが出なくなる(?))
- 追記: じゃあ ruby だとどうなるのか気になったのでやってみた
- Array#each
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 ) => ["1", "2", "3", "4", "5", "6"] irb(main):002:0> hoge.each { p hoge; hoge << 1 } ["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 無限ループ
- Array#size#times にしてみる
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 ) => ["1", "2", "3", "4", "5", "6"] irb(main):002:0> hoge.size.times { p hoge; hoge << 1 } ["1", "2", "3", "4", "5", "6"] ["1", "2", "3", "4", "5", "6", 1] ["1", "2", "3", "4", "5", "6", 1, 1] ["1", "2", "3", "4", "5", "6", 1, 1, 1] ["1", "2", "3", "4", "5", "6", 1, 1, 1, 1] ["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1] => 6
Array#size で取得した値はコレクションの変更に影響されないようだ
- for
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 ) => ["1", "2", "3", "4", "5", "6"] irb(main):088:0> for h in hoge { p hoge; hoge << 1 } #=> なぜか無視される.do-endしか使えないかな? irb(main):089:0> for h in hoge do p hoge; hoge << 1 end ["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 無限ループ
- こんなことしていないで研究に集中するべきだし,今はとっとと寝るべき...