1. ホーム
  2. c#

[解決済み] HashSet<T>から実際のアイテムを取り出すには?

2023-03-07 08:08:14

質問

私が読んだのは この質問 を読みましたが、なぜそれができないのか、解決策は見つかりませんでした。

私は、.NETの HashSet<T> . このようなシグネチャを持つようなメソッドを探しています。

/// <summary>
/// Determines if this set contains an item equal to <paramref name="item"/>, 
/// according to the comparison mechanism that was used when the set was created. 
/// The set is not changed. If the set does contain an item equal to 
/// <paramref name="item"/>, then the item from the set is returned.
/// </summary>
bool TryGetItem<T>(T item, out T foundItem);

このような方法でセットからアイテムを検索するのは O(1) となります。から項目を取り出す唯一の方法は HashSet<T> から項目を取り出す唯一の方法は、すべての項目を列挙することであり、これはO(n)です。

この問題に対する回避策は、自分で HashSet<T> を作るか、あるいは Dictionary<K, V> . 他のアイデアは?

注意してください。

をチェックするのではなく HashSet<T> にアイテムが含まれているかどうかをチェックしたいのではありません。に格納されているアイテムへの参照を取得したいのです。 HashSet<T> に格納されているアイテムへの参照を取得したいのですが、 (別のインスタンスに置き換えることなく) そのアイテムを更新する必要があるからです。私が TryGetItem に渡す項目は (コンストラクタに渡した比較メカニズムによれば) 等しくなりますが、同じ参照ではありません。

どのように解決するのですか?

あなたが求めているものは .NET Core 1 年前 であり 最近、.NET 4.7.2 に追加されました。 :

.NET Framework 4.7.2 では、標準のコレクション型にいくつかの API を追加し、次のような新しい機能を実現しました。

- 'TryGetValue' が SortedSet と HashSet に追加され、他のコレクション タイプで使用される Try パターンに一致するようになりました。

署名は以下の通りです(.NET 4.7.2以降で見られます)。

    //
    // Summary:
    //     Searches the set for a given value and returns the equal value it finds, if any.
    //
    // Parameters:
    //   equalValue:
    //     The value to search for.
    //
    //   actualValue:
    //     The value from the set that the search found, or the default value of T when
    //     the search yielded no match.
    //
    // Returns:
    //     A value indicating whether the search was successful.
    public bool TryGetValue(T equalValue, out T actualValue);

P.S ...:一応、興味がある人は 関連の機能があり、将来的に追加される予定です。 - HashSet.GetOrAdd(T)があります。