東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

しょもないもん作った: SelectEnumerable

int[] ia = { ... };
// 偶数だけ取り出す
foreach ( int item in 
    
new SelectEnumerable<int>(ia, delegate(int n) { return n % 2 == 0;}) ) {
  Console.WriteLine(item); // 取り出す条件を delegate で与える
}

↓もーヤケクソ

using System;
using System.Collections;
using System.Collections.Generic;

namespace Wankuma.Collections.Generic {

  struct SelectEnumerator<T> : IEnumerator<T> {
    private IEnumerator<T> enumerator_;
    private Predicate<T> predicate_;
    public SelectEnumerator(IEnumerator<T> enumerator, Predicate<T> predicate)
      { enumerator_ = enumerator; predicate_ = predicate; }
    public T Current
      { get { return enumerator_.Current; } }
    object IEnumerator.Current
      { get { return  enumerator_.Current; } }
    public void Dispose()
      { enumerator_.Dispose(); }
    public bool MoveNext()
      { while ( enumerator_.MoveNext() ) {
          if ( predicate_(enumerator_.Current) ) return true;
        }
        return false; }
    public void Reset()
      { enumerator_.Reset(); }
  }

  public class SelectEnumerable<T> : IEnumerable<T> {
    private IEnumerable<T> enumerable_;
    private Predicate<T> predicate_;
    public SelectEnumerable(IEnumerable<T> enumerable, Predicate<T> predicate)
      { enumerable_ = enumerable; predicate_ = predicate; }
    public IEnumerator<T> GetEnumerator()
      { return new SelectEnumerator<T>(enumerable_.GetEnumerator(), predicate_); }
    IEnumerator IEnumerable.GetEnumerator()
      { return new SelectEnumerator<T>(enumerable_.GetEnumerator(), predicate_); }
  }

}

投稿日時 : 2006年12月1日 14:48

コメントを追加

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/01 21:37 Gushwell

おおっ、これ、いいですね。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/01 22:05 επιστημη

わーいウケたー♪ 下手なテッポもなんとやら。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 0:09 Kazuki

一連のものに脱帽です

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 1:41 siokoshou

はじめまして!これでいかがでしょう?
static IEnumerable<T> Select<T>( IEnumerable<T> e, Predicate<T> predicate )
{
foreach ( T var in e )
if ( predicate( var ) )
yield return var;
}
#最近こういうのにはまっております。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 1:50 επιστημη

…そっかー、yieldかー。ざっくし楽になるんだなー orz
どうもC++の感覚がありますもんで、古風なスタイルなんやねー。
yieldべんきょして、暇見つけて書きなおそっかしら。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 3:26 επιστημη

そかそか、yield使ってIEnumerable<T> を作ると、
そいつから生成されたIEnumerator<T> はReset() できないのか。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 7:26 siokoshou

実はこのあたり、時期C#のLINQの根幹をなしてるようです。LINQプレビューを落として見てみたら、STLと初めて出会ったとき同様の強烈なショックを受けましたw
IEnumerable<T>はSTLのイテレータのように糊として十分な機能を持っているようです。ただし、性能が大変気になりますが…

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 8:47 επιστημη

…性能については怪しさタプーリですね。
MoveNextのたんびにyieldしたとこに戻らなきゃいけないんだから、
スレッドやsetjmp/lonpjmpあるいはtry/throw/catchみたいに
コンテキスト切り替えっぽいことが起こってるに違いないすから。

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 16:47 mei

>…性能については怪しさタプーリですね。
コンパイル時にステートマシン作っているだけなので、そんなに性能劣化はないはずですよ。

菊池さんの記事が参考になると思います。
http://www.atmarkit.co.jp/fdotnet/special/cs20review02/cs20review02_02.html

# re: しょもないもん作った: SelectEnumerable<T> 2006/12/02 16:55 επιστημη

そーなの? yield地点を覚えといて、次のMoveNextでそこに戻らんならんけど、それがstate-machineで実現できるんならさほどにキツくないのか。
実測してみりゃえーわね。

# VrmpmMvfkbEdKe 2011/12/22 20:20 http://www.discreetpharmacist.com/

Ia8BbN It`s really useful! Looking through the Internet you can mostly observe watered down information, something like bla bla bla, but not here to my deep surprise. It makes me happy..!

タイトル
名前
URL
コメント