であるC#ジェネリックコンテナを探していList<T>
ますが、繰り返し要素は許可されていません。
言い換えれば、それはですが、演算子Set<T>
を介してアクセスすることもできます。[index]
ありがとう。
であるC#ジェネリックコンテナを探していList<T>
ますが、繰り返し要素は許可されていません。
言い換えれば、それはですが、演算子Set<T>
を介してアクセスすることもできます。[index]
ありがとう。
コメントで示唆されているよう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();
}
}
}
}
私はこのコードをコンパイルしませんでした、しかしあなたは考えを理解します...
フレームワークではそのようなものは提供されて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
。
OrderedDictionaryを使用できます。キータイプと値タイプの両方にタイプを使用し、キーと値の両方と同じオブジェクトを使用すると、必要な動作が得られます(キーコレクションをインデックスベースの取得に使用し、ダミーデータを値に貼り付けることもできます。しかし、私はあなたが何を得るのかわかりません)。