1

実は、大学のプロジェクトとしてリンクリストを実現しようとしています。最初のステップでは、ListElementBaseデータ型ごとにこのクラスから継承するクラスと重大なListElementクラスをプログラムしました。

そして2番目のステップでは、代わりに、より柔軟な単一の構造をプログラムしようとします。構造体は、値をオブジェクトとして保持し、値のデータ型を保持する必要があります。これにより、値のキャスト先となるデータ型の情報がオブジェクト内に含まれるようになります。

どういうわけかこのように:

private struct Element
{
    public Element Previous;
    public Element Next;

    public object Value;
    public ValueType Type;

    public Element(Element sPrevious, Element sNext, object sValue, ValueType sType)
    {
        Previous = sPrevious;
        Next = sNext;
        Value = sValue;
        Type = sType;
    }
}

しかし、DataTypeの処理方法がわかりません。DataTypeのインスタンスを作成したり、のようなコンストラクターを呼び出したりすることはできませんnew Element(..., ..., ..., string)

私は完全に間違った道を進んでいますか?

4

3 に答える 3

1

さて、あなたはオブジェクトの任意のタイプ(および任意の組み合わせ)を含むことができる異種リストを作成したいと思います。それはジェネリックが出ていることを意味します。

object.GetType()

コンストラクターに渡されるオブジェクトのタイプを自動的に判別する場合は、次のElementように行うことができます。

public Element(Element sPrevious, Element sNext, object sValue)
{
    Previous = sPrevious;
    Next = sNext;
    Value = sValue;
    Type = (sValue != null) ? sValue.GetType() : typeof(object);
}

つまり、typeパラメーターを完全に渡すことを避け、オブジェクトに要求するだけです。

これは、すべてのオブジェクトがから派生しSystem.Object、メソッドが存在するために機能しますSystem.Object.GetType()

ただし、がnullの場合は機能しませsValue。そのため、nullをチェックし、タイプをobjectifsValueがnullに設定します。

nullオブジェクトを渡し、タイプを指定する機能を維持したい場合(少し奇妙ですが、それでも...)、オブジェクトをまったく指定せず、タイプだけを指定する別のメソッドを使用できます。 :

public Element(Element sPrevious, Element sNext, Type type)
{
    Previous = sPrevious;
    Next = sNext;
    Value = null;
    Type = type;
}

しかし、私はその有用性に疑問を持っています。

typeof()

不足しているもう1つの情報は、演算子Typeを使用して型名からオブジェクトを取得できることです。次に例を示します。typeof()

Type t1 = typeof(string);
Type t2 = typeof(int);

値とタイプを実際にどのように使用するのかわかりません。たくさんの「チェックタイプアンドキャスト」コードが必要になると思いますが、それが良いアイデアかどうかはわかりません...

于 2013-03-24T11:23:39.847 に答える
0

手動のキャストや型の保存の代わりにジェネリックを使用してみてください。

(そしてもちろん、ListとLinkedListはすでに.Netフレームワークに実装されています)

于 2013-03-24T10:09:53.470 に答える
0

ジェネリックスを使用した二重リンクリストの要素の最も単純で単純な実装は、次のようになります。

public class Element<T>
{
    public Element<T> Prev { get; set; }
    public Element<T> Next { get; set; }
    public T Value { get; set; }

    public Element(T value, Element<T> prev, Element<T> next)
    {
        Prev = prev;
        Next = next;
        Value = value;
    }
}

Tは型パラメータであり、必要に応じて指定できます。これで、外部クラス実装や内部クラス実装ValueTypeのような値型を取得できるため、を省略できます。element.Value.GetType()typeof(T)

リストを作成するには、次のコードスニペットを使用します。

var now = DateTime.Now;
var first  = new Element<DateTime>(now, null, null);

var second = new Element<DateTime>(now.AddDays(1), first, null);
first.Next = second;

var third = new Element<DateTime>(now.AddDays(2), second, null);
second.Next = third;

オブジェクトを作成するメソッドを使用してファクトリを作成することを検討してください。次に、ジェネリックパラメーターの指定を省略できます。これらは、メソッドの使用法から推測(または推測)されます。例えば:

public class Factory
{
   public static Element<T> Create<T>(T value, Element<T> prev, Element<T> next)
   {
        return new Element<T> (value, prev, next);
   }
}

これで、次のような要素を作成できます。

var now = DateTime.Now;

var first  = Factory.Create(now, null, null);

var second = Factory.Create(now.AddDays(1), first, null);
first.Next = second;

var third = Factory.Create(now.AddDays(2), second, null);
second.Next = third;

これは、さまざまなジェネリックパラメーターがたくさんある場合に便利です。

于 2013-03-24T10:20:52.707 に答える