R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

KeyValuePare<> が意外に使える件

主に

クラスを作るのが面倒くさい時

に KeyValuePair<> を使ってしまう。

例えば、コマンドオブジェクトを作ろうとする時は


var commands = new Directory<string, KeyValuePair<string, Action>> {
  "logout", new KeyValuePair<string, Action>("ログアウト"  , () => { /* -- 実装 --*/ }),
  "cut"  , new KeyValuePair<string, Action>("切り取り"  , () => { /* -- 実装 --*/ }),
  "copy"  , new KeyValuePair<string, Action>("コピー"    , () => { /* -- 実装 --*/ }),
  "paste"  , new KeyValuePair<string, Action>("貼り付け"  , () => { /* -- 実装 --*/ }),
};


みたいな感じ。
重なるとわかりにくいから、上記のようにせいぜい 2 つくらいだけど。

もう少し多くしたい場合もあるから、Action とか Func デリゲートみたいに、こういうクラスとか作ってほしいな。


public class Hoge<T> {
  public T Value { get; set; }
}

public class Hoge<T, T> {
  public T Value1 { get; set; }
  public T Value2 { get; set; }
}

public class Hoge<T, T, T> {
  public T Value1 { get; set; }
  public T Value2 { get; set; }
  public T Value3 { get; set; }
}

 :
 :
つづく
 :


みたいなw

既にあるのかな?

なければ作ろう・・・・というか上ので既にできている訳だけど。

投稿日時 : 2009年2月6日 14:48

Feedback

# re: KeyValuePare<> が意外に使える件 2009/02/06 15:51 NyaRuRu

それは多くの先行するプログラミング言語で tuple と呼ばれているものです.
.NET Framework 4.0 で追加されるという話もありますね.

# re: KeyValuePare<> が意外に使える件 2009/02/06 16:02 NyaRuRu

see http://blogs.wankuma.com/rti/archive/2008/02/25/124738.aspx

# re: KeyValuePare<> が意外に使える件 2009/02/06 17:10 中博俊

最近書いたばかりなのに
http://blogs.wankuma.com/naka/archive/2009/01/28/166956.aspx

# re: KeyValuePare<> が意外に使える件 2009/02/06 17:36 凪瀬

私は、クラスを作るのを面倒くさがって配列とかハッシュテーブルとかで代用するのは設計のアンチパターンと見ています。
静的型付けの恩恵を捨てたいなら止めないけど。

# re: KeyValuePare<> が意外に使える件 2009/02/06 19:44 NyaRuRu

>>凪瀬さん
>静的型付けの恩恵を捨てたいなら止めないけど。

なんかこの中で凪瀬さんだけが違う話をしてそうな.

ここで延べられている tuple は typed です.
Object 型の配列に格納するような話とは大分異なります.
(あと tuple は別に静的型付言語専用ということもないですね)

# re: KeyValuePare<> が意外に使える件 2009/02/07 1:49 凪瀬

型は単一なんでしょ?
別のデータ型の情報を足したくなったら破綻するんじゃないの?
機械処理によるリファクタリングとかも期待できなくなっちゃうよ?

# re: KeyValuePare<> が意外に使える件 2009/02/07 3:31 uskz

>型は単一なんでしょ?
ちがいます.例えば Haskell において型 A の変数 a と型 B の変数 b に対して,タプル (a, b) は型 (A, B)を持ちます.

# re: KeyValuePare<> が意外に使える件 2009/02/07 5:08 渋木宏明(ひどり)

(匿名型のコレクション).ToDictionary() のが楽ぽ。

# re: KeyValuePare<> が意外に使える件 2009/02/07 11:11 NyaRuRu

>>凪瀬

ああ,一点重要な点を追記ですが,

Rさんお得意の,
>クラスを作るのが面倒くさい時
を,字面的に肯定するわけではないです.

値のペアが必要になったとき,
・クラス/構造体を新設するか
・tuple で書くか
・anonymous type (record) で書くか
は適時判断して使っています.

私が C# を使う場合でも,バージョニングが絡む場合は凪瀬さんが仰るようにクラス/構造体を作りますし,識別子に名前が欲しければ anonymous type を使います.
また,tuple をネイティブにサポートする言語の多くは,ラムダ式や型推論,言語組み込みのパターンマッチングといった言語支援があるのが普通で,それらとの相乗効果で tuple が使いやすいという側面もあることに注意してください.
JVM 上の言語では,Scala が tuple をサポートしている (というより,Scala チックな書き方の多くが tuple によって支えられている) ので,一度その手の言語を試されてみてはいかがでしょうか?

# re: KeyValuePare<> が意外に使える件 2009/02/07 11:11 NyaRuRu

>>凪瀬さん

ああ,一点重要な点を追記ですが,

Rさんお得意の,
>クラスを作るのが面倒くさい時
を,字面的に肯定するわけではないです.

値のペアが必要になったとき,
・クラス/構造体を新設するか
・tuple で書くか
・anonymous type (record) で書くか
は適時判断して使っています.

私が C# を使う場合でも,バージョニングが絡む場合は凪瀬さんが仰るようにクラス/構造体を作りますし,識別子に名前が欲しければ anonymous type を使います.
また,tuple をネイティブにサポートする言語の多くは,ラムダ式や型推論,言語組み込みのパターンマッチングといった言語支援があるのが普通で,それらとの相乗効果で tuple が使いやすいという側面もあることに注意してください.
JVM 上の言語では,Scala が tuple をサポートしている (というより,Scala チックな書き方の多くが tuple によって支えられている) ので,一度その手の言語を試されてみてはいかがでしょうか?

# re: KeyValuePare<> が意外に使える件 2009/02/07 11:16 NyaRuRu

>>凪瀬さん

すみません.ふたつ上の投稿で「さん」が抜けてました.

# re: KeyValuePare<> が意外に使える件 2009/02/07 13:19 R・田中一郎

NyaRuRu さん

>see http://blogs.wankuma.com/rti/archive/2008/02/25/124738.aspx

以前も話題にあげてたんですね。
すっかり忘れてました。

-------------------------------
中博俊 さん

>最近書いたばかりなのに

見落としてました。
これ便利ですね。


-------------------------------
凪瀬 さん

>私は、クラスを作るのを面倒くさがって配列とかハッシュテーブルとかで代用するのは設計のアンチパターンと見ています。

クラスを作るのを面倒くさい時というのは、ちょっと語弊がある表現だったかもしれません。
うーん、何というか、要するにクラスを作るまでもないという時というか、例えば外部に公開しない汎用性の乏しいもの、みたいな感じでしょうか。

-------------------------------
uskz さん

>>型は単一なんでしょ?
>ちがいます.例えば Haskell において型 A の変数 a と型 B の変数 b に対して,タプル (a, b) は型 (A, B)を持ちます.

ですね・・・

#タプルと読むんですね^^;

-------------------------------
渋木宏明(ひどり) さん

>(匿名型のコレクション).ToDictionary() のが楽ぽ。

なんてこった!
そんな技があったとは!

今すぐ使えますね。早速使おう。

# DGDeEvBBPj 2011/12/16 2:03 http://www.healthinter.org/health/page/prednisolon

I must admit, the webmaster is a cool guy..!

タイトル
名前
Url
コメント