2006年10月26日

ReadOnlyCollectionBaseで読み取り専用コレクションを

   このエントリーをはてなブックマークに追加 Clip to Evernote
ReadOnlyCollectionBaseを使えば、C#で読み取り専用のコレクションクラスを比較的簡単に作れる。
こんな感じ。
public class ReadOnlyCollection<T> : System.Collections.ReadOnlyCollectionBase {
public ReadOnlyCollection(IList<T> sourceList) {
foreach ( T o in sourceList ) {
InnerList.Add(o);
}
}

public T this[int index] {
get { return ((T)(InnerList[index])); }
}

public int IndexOf(T value) {
return (InnerList.IndexOf(value));
}

public bool Contains(T value) {
return (InnerList.Contains(value));
}
}

使い方は、インスタンス生成がちょっと面倒だけれど、安全性は高まる。
ReadOnlyCollection<char> list = new ReadOnlyCollection<char>(
new char[] { 'A', 'B', 'V', 'D'} );
foreach (char c in list) {
Console.WriteLine(c);
}

当たり前だが、
list[0] = 'A';
のようなコードはコンパイルエラーになる。


この記事へのコメント
foreach (T o in sourceList) {
InnerList.Add(o);
}

のところは
InnerList.AddRange((System.Collections.ICollection)sourceList);
でもいいんでしょうか。

Microsoftさん
InnerListがGeneric版のものがほしいです。
Posted by まきなす at 2006年10月27日 12:59
配列をコンストラクタに渡した時は、System.Collections.ICollectionを実装しているのでOKですが、
他のクラスにおいては、IList<T> を実装しているクラスが、System.Collections.ICollectionを実装しているという保証はないので、危険だと思います。


>InnerListがGeneric版のものがほしいです。
ほんとですね。

直接関係ないけど、

public ReadOnlyCollection(IList<T> sourceList) {

の IList<T> のところを、ICollection<T> にしたほうが、良いかもです。
Posted by Gushwell at 2006年10月27日 18:02
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50619098