C#でHashSetはあるがSetはないのはなぜですか?
質問
古い質問
私の理解では、C#にはある意味でHashSet
およびset
タイプがあります。 HashSet<Object>
とは何かを理解しています。しかし、なぜSet
は別の単語ですか?なぜすべてのセットがDictionary
ではないのですか?
新しい質問
C#には、ISet
タイプに似た汎用ICollection
タイプがないのはなぜですか?私の観点から、標準の検索/追加/削除のパフォーマンスを備えたセットが欲しいです。ハッシュなどで実現されるかどうかはあまり気にしません。では、このバージョンのC#では実際にIEnumerable
として実装されるが、おそらく将来のバージョンでは多少異なるセットクラスを作成しないのはなぜですか?
または、少なくともインターフェイスHashedSet
ではないのはなぜですか?
回答
以下の回答をしてくれたすべての人に感謝します:<=>は<=>に期待することの多くを実装します。しかし、私の観点からは、<=>は<=>を実装しますが、セットは列挙可能である必要はありません---例:1から2までの実数のセット(さらに、セットは動的に生成できます)。 「普通のプログラマー」は数え切れないほどのセットを必要とすることはめったにないので、これはマイナーな暴言に同意します。
わかりました、わかりました。 <=>は絶対に<=>と呼ばれることを意図していましたが、単語<=>は何らかの意味で予約されています。より具体的には、.NETアーキテクチャの作成者は、さまざまな言語のクラスの一貫したセット(sic!)を望んでいました。これは、標準クラスのすべての名前が.NET言語のキーワードと一致してはならないことを意味します。ただし、単語<=>はVB.NETで使用されますが、実際には大文字と小文字が区別されない(そうですか?)ので、残念ながらそこに操作する余地はありません。
謎解き:)
エピローグ
Alex Y.による新しい回答はにリンクしています。 MSDNページ。今後の.NET 4.0インターフェースの説明 <=> 。これは、思ったとおりに動作し、<=>によって実装されます。ハッピーエンド。
解決
(set
に関する元の質問に回答しました。IIRC、<!> quot; set <!> quot;は英語で最も異なる意味を持つ単語です...明らかにこれはコンピューティングに影響を与えます)。
その名前にHashSet<T>
を付けても構いませんが、ISet<T>
インターフェイスを歓迎します。 LinkedHashSet
が.NET 3.5にのみ到着したことを考えると(それ自体は驚くべきことでした)、セットベースの型のより完全なコレクションが最終的に得られると思われます。特に、挿入順序を維持するJavaのICollection<T>
に相当するものが、場合によっては役立ちます。
公平を期すために、get
インターフェースは実際にfetch
で必要なもののほとんどをカバーしているので、おそらく必要ではありません。ただし、セットの主な目的(主に封じ込めに関するものであり、要素を反復処理できることに関してのみ接線方向にある)は、コレクションとはまったく同じではないと主張することができます。トリッキーです。実際、真に数学的なセットは反復可能または数えられない場合があります。たとえば、<!> quot; 1〜2の実数のセットがあります。<!> quot;任意精度の数値型を使用している場合、カウントは無限になり、それを反復しても意味がありません。
同様に<!> quot; adding <!> quot;のアイデア。セットにすると、必ずしも意味がありません。コレクションに名前を付けるとき、可変性は扱いにくいビジネスです:(
編集:さて、コメントへの応答:キーワードassign
はVisual Basicで行うレガシーではありません。これは、プロパティの値を設定する操作と、操作を取得する です。これは、操作としてのセットの概念とは関係ありません。
代わりに、キーワードが実際に<=>および<=>であったと想像してください。例:
// Not real code!
public int Foo
{
fetch
{
return fooField;
}
assign
{
fooField = value;
}
}
そこで目的は明確ですか?これで、C#の real に相当するものはただ
public int Foo
{
get
{
return fooField;
}
set
{
fooField = value;
}
}
だからあなたが書いた場合:
x = y.Foo;
プロパティの<=>部分を使用する。書く場合:
y.Foo = x;
<=>部分を使用します。
それはより明確ですか?
他のヒント
Set <T>
はありません。この BCLチームのブログ投稿には、名前にハッシュを含めることに関する完全に決定的な議論ではないなど、HashSetに関する詳細がたくさんあります。 BCLチームの全員がHashSet <=>という名前を使用する決定を好んだとは思わない。
set
は、バージョン1.0以降で使用されているC#言語のキーワードです。は、プロパティの値を割り当てる部分を定義するために使用されます(およびget
は、プロパティの値を読み取る部分を実装するために使用されます)。このコンテキストでは、値を設定する場合のように、「セット」という単語を動詞として理解する必要があります。
HashSet<T>
は、セットの数学的概念の特定の実装です。最初に.NET 3.5で導入されました。 BCLチームによるこのブログ投稿では、その背後にある理由の詳細と、名前がSet<T>
だけでなく<=>である理由のいくつかの手がかりを説明しています。 http://blogs.msdn.com/bclteam/archive/2006/11/09/introducing -hashset-t-kim-hamilton.aspx 。
<=>の場合、「セット」という単語を名詞として理解する必要があります。
SetはVB.NETの予約キーワードです(C#のsetと同等です)。 VB.NETはキーワードと同じ名前のクラス/メソッド/などを使用できますが、角かっこで囲む必要がありますが、これは見苦しいです:
Imports Wintellect.PowerCollections 'PowerCollections contains a class called Set'
Public Class Test
Private _myValue As Integer
Public Property MyValue() As Integer
Get
Return _myValue
End Get
Set ' Set as keyword'
_myValue = value
End Set
End Property
Public Function X As [Set](Of Integer)
Dim a As New [Set](Of Integer) ' Set as class'
Return a
End Function
End Class
ああ、私は今あなたの質問を理解しています
ISet<T>
の必要性を100%確認できるかどうかはわかりません。
質問は、セットの基本的な動作としてどのように見えますか?
追加、削除、含むなど。その場合、ICollection<T>
は既にそのためのインターフェイスを提供します。
Union、Intersectなどの設定操作の場合、コントラクトスタイルの施行に抽象化するのに十分な汎用性があると考えられるものですか?
これに対する正しい答えがわからないことを言わなければならない-私はそれが議論に開かれていると思うし、BCLチームが将来のバージョンでこのようなものを置くことになると思うが、それは彼ら次第だ。私は個人的には機能の大きな欠落部分としてそれを見ていない
オリジナルポスト
少なくとも私の知る限りでは、BCLにはSetコレクションがありません。
Iesi.Collections
のようないくつかのサードパーティセットライブラリがあります。
HashSet<T>
は.NET 3.5で導入され、重複のないコレクションが必要な高速セットコレクションを作成します。また、UnionやJoinなどの典型的な集合演算もあります。
このリンク HashSetのBCLチームから
通常、以前はList<T>
を使用する必要があった場所で使用し、追加時に重複をチェックします。
<=>へのアイテムの追加は、リストよりも大幅に高速にすることもできます
いくつかの詳細:
HashSetのもう1つの優れた機能は、複製を追加しようとしても例外をスローしないことです。複製エントリの追加に失敗するだけで、追加のたびにtry.catchブロックを大量に配置する必要がなくなります。 p>
少なくとも.NET 3.5(および.NET 4.0ではないようです)には、BCLにSet<T>
クラスがないことを確信しています。とにかく、そのようなクラスの必要性は何でしょうか?
HashSet<T>
自体は、要素を比較するためにハッシュコード(オブジェクトのGetHashCode
メソッド)を使用する単なる通常のセットデータ構造です。これは、単にセット型を実装する効率的な方法です。 (同等性をチェックする他の方法では、パフォーマンスが低下する可能性があります。)