0

であるC#ジェネリックコンテナを探していList<T>ますが、繰り返し要素は許可されていません。

言い換えれば、それはですが、演算子Set<T>を介してアクセスすることもできます。[index]

ありがとう。

4

3 に答える 3

1

コメントで示唆されているようIList<T>に、内部インスタンスにデリゲートを実装し、ガードは:List<T>を使用して呼び出しを追加および削除できます。HashSet<T>

public class UniqueList<T> : IList<T>
{
    private readonly List<T> list=new List<T>();
    private readonly HashSet<T> set=new HashSet<T>();
    public IEnumerator<T> GetEnumerator()
    {
        return list.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Add(T item)
    {
        if(set.Add(item))
        {
            list.Add(item);
        }
    }

    public void Clear()
    {
        set.Clear();
        list.Clear();
    }

    public bool Contains(T item)
    {
        return set.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        list.CopyTo(array,arrayIndex);
    }

    public bool Remove(T item)
    {
        if(set.Remove(item))
        {
           list.Remove(item);
            return true;
        }
        return false;
    }

    public int Count { get { return list.Count; } }
    public bool IsReadOnly { get { return false; } }
    public int IndexOf(T item)
    {
        return list.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        if(set.Add(item))
        {
            list.Insert(index, item);
        }
    }

    public void RemoveAt(int index)
    {
        T item = list[index];
        set.Remove(item);
        list.RemoveAt(index);
    }

    public T this[int index]
    {
        get { return list[index]; }
        set {
            T item = list[index];
            set.Remove(item);
            if(set.Add(value))
            {
                list[index] = value;    
            }
            else
            {
                set.Add(item);
                throw new Exception();
            }


        }
    }
}

私はこのコードをコンパイルしませんでした、しかしあなたは考えを理解します...

于 2012-08-15T05:57:44.173 に答える
1

フレームワークではそのようなものは提供されてHashSet<T>いません(特定の順序を保証するものではないため、でごまかすことはできませんElementAt)。使用できる最も近いビルトインは、次のようなものになりますSortedList<T,anything>(「何でも」は関係ありません。またT、、、intなど)のようになります。

var data = new SortedList<string, int>();
data["abc"] = 1;
data["def"] = 1;
data["abc"] = 1;
var thisIsTrue = data.ContainsKey("def");
var thisIsFalse = data.ContainsKey("ghi");
for (int i = 0; i < data.Count; i++) // 2 iterations
    Console.WriteLine(data.Keys[i]); // abc, def

でも; ここで保証される順序は、挿入順序ではなく、キー順序であることに注意することが重要です。キーのインデックスは、を介して利用できますdata.IndexOfKey

于 2012-08-15T05:58:56.247 に答える
0

OrderedDictionaryを使用できます。キータイプと値タイプの両方にタイプを使用し、キーと値の両方と同じオブジェクトを使用すると、必要な動作が得られます(キーコレクションをインデックスベースの取得に使用し、ダミーデータを値に貼り付けることもできます。しかし、私はあなたが何を得るのかわかりません)。

于 2012-08-15T06:12:22.207 に答える