26

古い質問

私の理解では、C# には何らかの意味HashSetset型があります。私は何を理解していHashSetます。しかし、なぜset別の単語なのですか?すべてのセットが ではないのはなぜHashSet<Object>ですか?

新しい質問

Set型と同様に、C# にジェネリック型がないのはなぜDictionaryですか? 私としては、検索・追加・削除の性能が標準的なセットが欲しいところです。それがハッシュで実現されているか、他の何かで実現されているかはあまり気にしません。では、実際にHashSetはこのバージョンの C# では として実装されるが、将来のバージョンでは多少異なるセット クラスを作成してみませんか?

または、少なくともインターフェースではないのはなぜISetですか?

答え

以下に回答してくれたすべての人に感謝しICollectionますISet。ただし、私の観点からは、セットが列挙可能である必要はありませんが、ICollection実装IEnumerableします --- 例: 1 と 2 の間の実数のセット (さらに、セットは動的に生成できます)。「普通のプログラマー」が無数のセットを必要とすることはめったにないので、これはマイナーな暴言であることに同意します。

わかりました、私はそれを理解したと思います。HashSetは絶対に呼び出されることを意図していましSetたが、この単語Setはある意味で予約されています。より具体的には、.NET アーキテクチャの作成者は、さまざまな言語に対して一貫性のある (原文のまま!) クラスのセットを持ちたいと考えていました。これは、標準クラスのすべての名前が .NET 言語のキーワードと一致してはならないことを意味します。ただし、という単語Setは、実際には大文字と小文字を区別しない VB.NET で使用されているため (そうですか?)、残念ながらそこには操作の余地がありません。

謎が解けました:)

エピローグ

Alex Y. による新しい回答は、次の .NET 4.0 インターフェイスについて説明しているMSDN ページへのリンクISetですHashedSet。ハッピーエンド。

4

7 に答える 7

19

(あなたの元の質問setに答えました。IIRC、「セット」は英語で最も異なる意味を持つ単語です...明らかに、これはコンピューティングにも影響を与えます。)

その名前でいいと思いますHashSet<T>が、インターフェイスはもちろん歓迎しISet<T>ます。それが .NET 3.5 でのみ導入されたことを考えるとHashSet<T>(それ自体が驚くべきことでした)、最終的にはセットベースの型のより完全なコレクションを取得できるのではないかと思います。特に、挿入順序を維持する Java の に相当するものは、LinkedHashSet場合によっては役立ちます。

公平を期すために、ICollection<T>インターフェイスは実際に必要なもののほとんどをカバーしてISet<T>いるため、必要ではないかもしれません。ただし、セットの主な目的 (主に包含に関するものであり、要素を反復処理できるようにすることに関するものです) は、コレクションとまったく同じではないと主張することもできます。トリッキーです。実際、真に数学的なセットは、反復可能またはカウント可能ではない場合があります。たとえば、「1 と 2 の間の実数のセット」を持つことができます。任意精度の数値型がある場合、カウントは無限になり、それを反復しても意味がありません。

同様に、セットに「追加」するという考えは、常に意味があるとは限りません。コレクションに名前を付けるとき、可変性はトリッキーなビジネスです:(

編集: わかりました、コメントへの応答: キーワードsetは決して Visual Basic と関係のある遺産ではありません。プロパティの値を設定する操作と、操作get取得する操作です。これは、操作としてのセットの考え方とは何の関係もありません。

代わりに、キーワードが実際にはfetchandassignだったと想像してください。

// Not real code!
public int Foo
{
    fetch
    {
        return fooField;
    } 
    assign
    {
        fooField = value;
    } 
}

そこで目的は明確ですか?現在、C # でこれに相当するものは、次のとおりです。

public int Foo
{
    get
    {
        return fooField;
    } 
    set
    {
        fooField = value;
    } 
}

したがって、次のように書くと:

x = y.Foo;

getプロパティの一部を使用します。あなたが書く場合:

y.Foo = x;

そのset部分を使用します。

それはより明確ですか?

于 2009-06-21T11:54:16.350 に答える
6

これの唯一の理由は、.NET 3.5 でこれを理想的に実装するためのリソースが不足しているようです。

.NET 4.0 には、HashSet - SortedSetに加えて、ISetとその新しい実装が含まれます。提供されている MSDN ライブラリへのリンクを確認してください。これらは .NET 4.0 beta1 で既に利用可能です。

于 2009-06-21T16:21:20.083 に答える
5

セットはありません<T>。このBCL チームのブログ投稿には、名前にハッシュを含めることについての完全に決定的な議論を含め、HashSet に関する多くの詳細が記載されています。BCL チームの全員が HashSet という名前を使用するという決定を気に入ったわけではないと思い<T>ます。

于 2009-06-21T11:38:52.310 に答える
4

setは、バージョン 1.0 から存在する C# 言語のキーワードです。Is は、プロパティの値割り当て部分を定義するために使用されます (また、プロパティgetの値読み取り部分を実装するために使用されます)。このコンテキストでは、値を設定する場合のように、'set' という単語を動詞として理解する必要があります。

HashSet<T>Set の数学的概念の特定の実装です。これは、.NET 3.5 で初めて導入されました。BCL チームによるこのブログ投稿では、その背後にある理由と、名前がHashSet<T>単なるものではなく、なぜそうでないのかについての手がかりSet<T>について詳しく説明しています。-hashset-t-kim-hamilton.aspx .

の場合、HashSet<T>'set' という単語は名詞として理解する必要があります。

于 2009-06-21T11:49:54.877 に答える
3

Set は VB.NET の予約済みキーワードです (C# の set と同等です)。VB.NET は、キーワードと同じ名前のクラス/メソッド/etc を使用できますが、それらは角括弧で囲む必要があり、見苦しくなります:

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
于 2009-06-21T12:44:26.640 に答える
2


ああ、私は今あなたの質問を理解していますISet<T>
問題は、どれがセットにとって不可欠な振る舞いだと思いますか?
Add、Remove、Containsなどですか。そうであれば、ICollection<T>すでにそのためのインターフェースを提供しています。
それが Union や Intersect などのセット操作である場合、それは契約スタイルの強制に抽象化するのに十分一般的であると考えられるものですか?

私はこれに対する正しい答えを知らないと言わざるを得ません - 議論の余地があると思います.BCLチームは将来のバージョンでこのようなものを最終的に入れるかもしれないと思いますが、それは彼ら次第です. 個人的には、機能が大幅に欠落しているとは思わない

元の投稿

少なくとも私が知る限り、BCL には Set コレクションがまったくありません。.NET 3.5 で導入されたIesi.Collections
のようなサード パーティの Set ライブラリがいくつかあり、高速なセット コレクションを作成します。つまり、重複のないコレクションが必要な場合です。また、Union や Join などの典型的なセット操作もあります。HashSet の BCL チームからのこのリンクをチェックしてください
HashSet<T>

List<T>通常、以前は追加時に重複を使用してチェックする必要があった場所で使用します。
に項目を追加するHashSet<T>ことも、Listよりも大幅に高速になる可能性があります。

いくつかの詳細:
HashSet のもう 1 つの優れた機能は、重複を追加しようとしても例外をスローしないことです。重複したエントリの追加に失敗するだけで、追加のたびに多くの try.catch ブロックを配置する必要がなくなります。 :)

于 2009-06-21T11:41:09.777 に答える
0

Set<T>少なくとも.NET 3.5にはBCLにクラスがないと確信しています(.NET 4.0にもないようです)。とにかく、そのようなクラスの必要性は何だと思いますか?

HashSet<T>それ自体は、ハッシュ コード (GetHashCodeオブジェクトのメソッド) を使用して要素を比較する通常の集合データ構造です。これは単にセット型を実装する効率的な方法です。(同等性をチェックする他の方法では、パフォーマンスが低下する可能性があります。)

于 2009-06-21T11:22:59.783 に答える