HashSet<String>
プライベート メンバーとして2 つのコレクションを持つクラスがあります。私のコード内の他のクラスは、これらの HashSet を反復処理してその内容を読み取れるようにしたいと考えています。HashSet 自体への参照を公開せずに、 HashSetsmyClass.getHashSet().Clear();
の要素を繰り返しに公開する他の方法はありますか? for-each ループと互換性のある方法でこれを行うことができれば幸いです。
7 に答える
.NET 3.5 を使用していると仮定すると、yield コードを自分で記述する代わりの 1 つの方法は、LINQ メソッドを呼び出すことです。例えば:
public IEnumerable<string> HashSet
{
get { return privateMember.Select(x => x); }
}
また
public IEnumerable<string> HashSet
{
get { return privateMember.Skip(0); }
}
このように使用できるさまざまなLINQ演算子があります-最初の「0値をスキップ」ループの後、おそらく他の回答に示されている/ループであるため、使用Skip(0)
がおそらく最も効率的です。このバージョンは、生成された各アイテムに対してノーオペレーション プロジェクション デリゲートを呼び出します。ただし、この違いが重要である可能性は天文学的に小さいです。コードを最も明確にするものを使用することをお勧めします。foreach
yield return
Select
メソッドを使用してSelect
、キャストバックできないラッパーを作成することもできHashSet<T>
ます。
public IEnumerable<int> Values
{
get { return _values.Select(value => value);
}
_values
これにより、 の場合のように 2 回以上の反復が回避されますが.ToArray()
、実装は 1 つのクリーンな行に保たれます。
IEnumerable<T>
プロパティを公開します。
public IEnumerable<whatevertype> MyHashSet {
get {
return this.myHashSet;
}
}
もちろん、このコードのユーザーはそれIEnumerable<T>
を aにキャストしてHashSet<T>
要素を編集できるので、(パフォーマンスは低下しますが) 安全を期すために、次のようにすることができます。
public IEnumerable<whatevertype> MyHashSet {
get {
return this.myHashSet.ToArray();
}
}
また:
public IEnumerable<whatevertype> MyHashSet {
get {
foreach(var item in this.myHashSet) {
yield return item;
}
}
}
よりパフォーマンスの高い保護方法ですが、呼び出し元にとっては便利ではありませんが、次を返すことIEnumerator<T>
です。
public IEnumerator<whatevertype> GetMyHashSetEnumerator() {
return this.myHashSet.GetEnumerator();
}
次のようなメソッド/プロパティを追加して、実際のコンテナーを公開しないようにします。
public IEnumerable EnumerateFirst()
{
foreach( var item in hashSet )
yield return item;
}
次のようなシーケンスを指定することもできます。
public IEnumerable<string> GetHashSetOneValues()
{
foreach (string value in hashSetOne)
yield return value;
}
このメソッドは、foreach ループ内で呼び出すことができます。
foreach (string value in myObject.GetHashSetOneValues())
DoSomething(value);
ゲッターが HashSet を IEnumerable として公開するようにします。
private HashSet<string> _mine;
public IEnumerable<string> Yours
{
get { return _mine; }
}
ジェネリック型が可変の場合、それは変更できますが、HashSet にアイテムを追加または削除することはできません。