2012-02-07 5 views
7

関連:A list of multiple data types?リスト内に異なるタイプを格納していますか?

私は、アレイ内の(システムタイプを含む)異なる配列型を格納する方法を知りたいです。

上記の質問は、インターフェイスを使用してユーザー定義クラスのみを許可するリストを作成する方法について説明しました。しかし、ダブルとストリングだけを受け入れるリストが必要な場合はどうすればいいですか?ダブルスと私が書いたクラスはどうですか?あなたが書いたクラスと他の人が書いたクラスだけを受け入れるリストはどうでしょうか(私は第三者クラスにインタフェースを追加できません)

私はList<object>を使用すると考えましたが、それが許容されたベストプラクティスであるかどうかはわかりません。

+0

おそらく私はC#を初めて勉強しています。 – Michael0x2a

+6

なぜそれをしたいですか?その必要があると思われる場合は、おそらくあなたが構築しているものに近づくためのより良い方法があります。特に、型がそれらの間に何の関係も持た​​ない場合。 –

+0

ええ、しかし、私は倍精度浮動小数点数型と文字列のみを受け入れるリストを必要とする場合はどうなりますか? – Michael0x2a

答えて

4

カスタムタイプだけでなく、カスタムタイプを指定することもできます。 List<int>List<double>List<string>も同様に機能します。混合型を格納する必要がある場合は、すべての型に最も近い基底クラスを指定する必要があります。 List<object>では、任意のタイプのインスタンスを格納することができます。

+0

これは、配列内の型のプロパティにアクセスすることを許可しません。私。 'List 'をお持ちなら、 'List 'にtype1とtype2を含めるように名前をつけてください。 List.FirstOrDefault(i => i.PropertyOfType1AndType2)を検索することはできません(type1とtype2のプロパティが同じであると仮定します)。 –

+0

@FranciscoSotoあなたが正しいと思います。コードを一から作成する場合は、これは必要ありません。質の高いよく考えられたコードを書くことが重要です。いくつかの魔法をする必要がある場合、何か汚いものをする方法を知ることが重要な場合もあります。たとえば、顧客を喜ばせるためです。 –

2

あなたは、何かあなただけのダブル、文字列を受け取りadd()メソッドを実装するカスタムコレクションを作成することができます

void Add(object toAdd) 
{ 
    if (toAdd is string) 
     // add into inner collection ... 
     ... (same for double) 
} 

をしかし、正直に言うと、私は本当にどのような方法を考えることはできませんこれらの2つのタイプだけを受け入れるコレクションが必要であることを示します。おそらく、それからちょうどそのクラスの配列を作成するには、

public class MyClass 
{ 
    public string x {get;set;} 
    public double y{get;set;} 
} 

クラスを作成する必要があります...他の方法

1

を問題を解決することができます。このクラスには、オブジェクト指向言語でオブジェクトを持つことの美しさがあります。

public MyClass[] someList=new MyClass[insert_number_of_elements]; 
4

あなたはスタッフ前のジェネリックのリストを使用する唯一の方法だったArrayListを、使用することができるタイプの安全性を与えるために喜んでいる場合。

二重線と文字列だけを受け入れるために、ラッパーコードの周りにいくつかのラッパーコードを置くことができます。

+0

ArrayListに何かを追加できますか?たとえば、int、string、Person?あなたは要素を得るためにどのようにしますか?あなたはそれをキャストしなければなりませんか? – Loaderon

1

また、?いずれも、一方または両方の値を持つことができる場合は、選択することができます

public class MyClass 
{ 
    public string? x {get;set;} 
    public double? y {get;set;} 
} 

この方法:オプションは、次のタイプのリストを作ります。

それとも、hasValueは/値の機能を好きではない場合:

public class MyClass 
{ 
    public enum EType { String, Double }; 

    EType TypeFilled {get; private set } 

    string _x; 
    public string X { get { return _x; }; set { _x = value; TypeFilled = EType.String; } 
    double y; 
    public double y { get { return _y; }; set { _y = value; TypeFilled = EType.Double; } 
} 

この方法では、typeFilledプロパティが満たされているかを決定。あなたは2回設定されないようにバリデーションを追加することができます。

関連する問題