Runtime: むンタヌフェむスIReadOnlySetを远加し、HashSet、SortedSetに実装させおください

䜜成日 2015幎06月09日  Â·  104コメント  Â·  ゜ヌス: dotnet/runtime

オリゞナル

IReadOnlyListが远加されおから、セットずリスト間のパリティが䜎䞋したした。 それを再確立するのは玠晎らしいこずです。

これを䜿甚するず、実装にずらわれない蚀い方になりたす。「これは、アむテムが䞀意であるこの読み取り専甚のコレクションです」。

明らかにそれは倚くの人々によっお必芁ずされおいたす

SQL Server https 
Roslyn https 
コメントの䞀郚の男 http 

蟞曞のキヌコレクションを読み取り専甚のセット操䜜に䜿甚したいずいう珟実の問題に取り組んでいるずきに、この議論を芋぀けたした。 その堎合をサポヌトするために、ここに私が提案するAPIがありたす。

線集

理論的根拠

提案されたAPI

 namespace System.Collections.Generic {
+    public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+        bool Contains(T value);
+        bool IsProperSubsetOf(IEnumerable<T> other);
+        bool IsProperSupersetOf(IEnumerable<T> other);
+        bool IsSubsetOf(IEnumerable<T> other);
+        bool IsSupersetOf(IEnumerable<T> other);
+        bool Overlaps(IEnumerable<T> other);
+        bool SetEquals(IEnumerable<T> other);
+    }
-    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
-    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
+    public class ReadOnlySet<T> : ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+        public int Count { get; }
+        public ReadOnlySet(ISet<T> set);
+        public bool Contains(T value);
+        public bool IsProperSubsetOf(IEnumerable<T> other);
+        public bool IsProperSupersetOf(IEnumerable<T> other);
+        public bool IsSubsetOf(IEnumerable<T> other);
+        public bool IsSupersetOf(IEnumerable<T> other);
+        public bool Overlaps(IEnumerable<T> other);
+        public bool SetEquals(IEnumerable<T> other);
+    }
     public class Dictionary<TKey, TValue> {
-        public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+        public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey>, IReadOnlySet<TKey> {
+            public bool IsProperSubsetOf(IEnumerable<TKey> other);
+            public bool IsProperSupersetOf(IEnumerable<TKey> other);
+            public bool IsSubsetOf(IEnumerable<TKey> other);
+            public bool IsSupersetOf(IEnumerable<TKey> other);
+            public bool Overlaps(IEnumerable<TKey> other);
+            public bool SetEquals(IEnumerable<TKey> other);
         }
     }
 }

未解決の質問

  • 䞀般的にむンスタンス化されるゞェネリック型のコヌドサむズコストを考えるず、これらのメ゜ッドをDictionary<TKey, TValue>.KeyCollection远加するこずは蚱容できたすか こちらをご芧ください。
  • IReadOnlySet<T> 、 SortedDictionaryやImmutableDictionaryなどの他のDictionary KeyCollection IReadOnlySet<T>に実装する必芁がありたすか

曎新

  • 削陀されたTryGetValueそれはないでありたすようISet<T>朜圚的に今たでにリベヌス防止するであろう、そのようにISet<T>実装するためにIReadOnlySet<T> 。
  • ReadOnlyCollection<T>類䌌したReadOnlySet<T>クラスを远加したした。
api-approved area-System.Collections up-for-grabs

最も参考になるコメント

提案されたAPI蚭蚈

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
    bool IsSubsetOf(IEnumerable<T> other);
    bool IsSupersetOf(IEnumerable<T> other);
    bool IsProperSupersetOf(IEnumerable<T> other);
    bool IsProperSubsetOf(IEnumerable<T> other);
    bool Overlaps(IEnumerable<T> other);
    bool SetEquals(IEnumerable<T> other);
}

これはISet<> APIに基づいおいたす明らかにミュヌテヌションメ゜ッドを陀く。

Comparerがこれに圓おはたらないのは残念ですが、 ISet<>もIReadOnlyDictionary<>比范察象を公開しおいないため、今すぐ修正するには遅すぎたす。

党おのコメント104件

物事を䞍倉にするための蚀語構造があればいいず思いたせんか そうすれば、これらの魔法のむンタヌフェヌスを持぀必芁はありたせん。

@whoisjどの蚀語 CLRには数十個ありたす。

朜圚的な蚀語機胜ずしおも、メタデヌタ衚珟が必芁になりたす。 この堎合、マヌカヌむンタヌフェむスたたは動䜜むンタヌフェむスは他のむンタヌフェむスず同じくらい優れおいたす。 新しいメタデヌタ゚ントリを介しおコレクションタむプの䞍倉性を䌝えようずするこずは、CLRが任意のクラスが内郚でどのように機胜するかに぀いお仮定を行うべきではないため、適切ではないようですCLRにはコレクションクラスの抂念がたったくありたせん。配列。

@whoisjこれは少なくずも将来のCバヌゞョンの1぀で考慮されおいるず思いたす。 ただし、その決定は、すべおのコレクションにわたる察称むンタヌフェヌスの必芁性に圱響を䞎えたせん。 さらに、コヌドの品質ずパフォヌマンスの䞡方を重芖するゲヌムなど、可倉アむテムの読み取り専甚リストが圹立぀シナリオを想像するこずもできたす。

たた、䞍倉のコレクションはすでに利甚可胜です。

https://msdn.microsoft.com/en-us/library/system.collections.immutablev = vs.111.aspx

完党に䞍倉のコレクションを実珟するには、 immutable Tを定矩し、それを䜿甚しおImmutable...<T>コレクションを宣蚀する方法が必芁です。

@HaloFour smirkの前にこの道をthis 」。

@dsaf絶察に 別の問題では、曞き蟌み可胜な芁玠の読み取り専甚コレクションの䜿甚を可胜にするために、読み取り専甚の曞き蟌み可胜なアンチタヌムを甚意するこずを提案したした。 readonly Bag<writable Element>の線に沿った䜕か。

&でマヌクされた参照は、コンパむラヌによっお䞍倉ずしお扱われるこずを提案したした。 私はただコンパむル時のチェックだけが必芁であり、実行時の保蚌ではなくロゞックのコンパむル時の怜蚌を䞻に求めおいるため、CLR自䜓によっお匷制される必芁があるず感じおいたす。 これは、開発者が䞍倉であるこずを望んでいたすべおの参照をカバヌしたすが、呌び出しごずに行われたす。

@whoisjおそらく、それはかなり接線的であり、dsafが今日の午埌に分岐/ PRできるものからのこの芁求を、3぀の異なるチヌム間の努力を䌎うものに倉えたす。

たた、これをコンパむラの問題ずしお扱っおいたす。 この時点では、JITコンパむラ以倖にコンパむラは関䞎しおおらず、「䞍適切な」コヌドの実行を防止できるのは怜蚌者だけです。 䞍倉性の既存のランタむムメカニズムであるinitonlyフィヌルドでさえ、怜蚌がスキップされた堎合たたはリフレクションを介しお、簡単に無効になる可胜性がありたす。

私は、C蚀語ずコンパむラが「玔粋な」メ゜ッドをより適切にサポヌトできれば玠晎らしいず思いたす。 属性PureAttributeすでに存圚したすが、散発的に䜿甚されおおり、実際には蚀語サポヌトはありたせん。 たた、Cがコンパむラ゚ラヌpureはpureのみを呌び出すこずができるなどによっおサポヌトしおいたずしおも、別の蚀語を䜿甚するこずで簡単に無効にできたす。 ただし、これらのメ゜ッドは、ILにコンパむルされるず基本的にすべおの賭けが無効になり、既存のアセンブリの実行方法を曲げるこずができないため、自分自身をアナりンスしお匷制する必芁がありたす。

@HaloFourフェア。

「玔粋な」たたは「定数」の参照をサポヌトする䞀般的な方法がないず仮定するず、提案されたものが最良の代替手段であるず思いたす。

今すぐ必芁な堎合は、私のCommonsラむブラリCommons.Collections https://github.com/yanggujun/commonsfornet/tree/master/src/Commons.Collections/Setで読み取り専甚セットがサポヌトされおいたす。 これが広告ず思われる堎合、管理者はこの投皿を削陀しおください...私の提案はいく぀かのオヌプン゜ヌスの実装を探し回るこずです。

@yanggujun提案をありがずう、それは玠晎らしいラむブラリのようですが、䜙分な䟝存関係を避けるために私は自分自身をロヌル

私の提案は、いく぀かのオヌプン゜ヌスの実装を探し回るこずです。

これは回避策であり、IReadOnlySetのような基本的なむンタヌフェむスは実際には.NETFramework自䜓の䞀郚である必芁がありたす。

これには「APIレビュヌの準備ができおいる」ためのスペックレットが必芁ですか

そしお、私たちがそれに取り組んでいる間、それを「ReadOnly」ずは異なる名前にするこずを怜蚎しおください興味深い投皿を参照しおくださいhttp//stackoverflow.com/questions/15262981/why-does-listt-implement-ireadonlylistt-in-net-4- 5
「読みやすい」は問題ないようです。

@GiottoVerducciいいえ。䞍完党な堎合でも、䞀貫した呜名パタヌンを維持したいず思いたす。 ただし、既存のむンタヌフェヌスの名前を倉曎するために、別の問題を自由に提起するこずができたす。

提案されたAPI蚭蚈

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
    bool IsSubsetOf(IEnumerable<T> other);
    bool IsSupersetOf(IEnumerable<T> other);
    bool IsProperSupersetOf(IEnumerable<T> other);
    bool IsProperSubsetOf(IEnumerable<T> other);
    bool Overlaps(IEnumerable<T> other);
    bool SetEquals(IEnumerable<T> other);
}

これはISet<> APIに基づいおいたす明らかにミュヌテヌションメ゜ッドを陀く。

Comparerがこれに圓おはたらないのは残念ですが、 ISet<>もIReadOnlyDictionary<>比范察象を公開しおいないため、今すぐ修正するには遅すぎたす。

    bool Contains(T item);

ICollection<T>はContains(T item)があるので、これIReadOnlyCollection<T>代わりに

䞍倉のコレクションパッケヌゞは、ただベヌタ版である間、nugetからリストから倖されたした。
これはかなり䞀般的なナヌスケヌスであり、暙準のラむブラリで凊理する必芁があるず思いたす。

タグが瀺すように、ここでAPIに察しお行うべき䜜業は他にもありたすか それが圹に立ち、誰かが䜕が必芁かを指摘するこずができれば、私はこれに少し時間を費やしおうれしいです。

提案されたAPI @ ashmindは玠晎らしく芋えたす。

ISet<T>にIReadOnlySet<T>を拡匵させるこずはできたすか これは起こりたせんIList<T> / IReadOnlyList<T> 

そうでない堎合は、考慮すべき他の倉曎は、 HashSet<T> 、 SortedSet<T> 、およびそれらを含むcorefxのすべおのISet<T>実装のむンタヌフェむスリストにIReadOnlySet<T>を远加するこずだず思いたす。 System.Collections.Immutable䞍倉の察応物。

@GiottoVerducciに同意するIReadOnlySet<T>ような名前を䜿甚しおも、コントラクト機胜は宣蚀されたせん。コントラクトの制限が宣蚀されたす。 次に、それらの制限ず矛盟する別の契玄ず組み合わせお同じ契玄を䜿甚するこずは混乱を招きたす。 契玄名は、実装者がサポヌトするものに関する肯定的な䞻匵を説明する必芁があるず思いたす。 確かに、 IReadableSet<T>ような名前は玠晎らしいものではありたせんが、少なくずも実装者が䜕をするかをよりよく説明しおいたす。

@HaloFour原則的に同意したすが、 IReadOnlyList<T>でも同じ状況になりたした。 䞀貫性を維持するこずは、ここでの粟床の向䞊よりも重芁です、IMHO。

@drewnoakes

私は理解しおいたす、そしお䞀貫性が重芁です。 しかし、それはISet<T>がIReadOnlySet<T>拡匵すべきではない理由にも答えるず思いたす。

䞀貫性を維持するこずは、ここでの粟床の向䞊よりも重芁です、IMHO。

しかし、それはISet<T>がIReadOnlySet<T>拡匵すべきではない理由にも答えるず思いたす。

私はあなたが芁点を逃しおいるず思いたす。 すなわち、その理由ですIList<T> 、 ICollection<T> 、 IDictionary<TKey, TValue> 、他にすべきであるISet<T> 、たた、読取り専甚ビュヌむンタフェヌスを実装するために固定されたす。 そうしないず、BCLの盎感的でない蚭蚈を回避するずきに、誰もががありたす。

@binki

私は同意したせん。 それに぀いお私が気に入らないのは、読み取り専甚の動䜜を芏定するコントラクトが、読み取り専甚の動䜜を芏定するコントラクトによっお拡匵されるこずです。 名前が間違っおいお、構成が間違っおいたす。 しかし、ここにありたす。 䞡方を倉曎するために投祚したいのですが、それがテヌブルにあるずは思えたせん。

@HaloFour

䜕かぞのむンタヌフェヌスを取埗するずき、それは䜕かぞの_ビュヌ_です。 ビュヌ自䜓は読み取り専甚です。 タむプセヌフなコヌドを蚘述し、アップキャストを回避しないず仮定するず、読み取り専甚のコヌドを受け取った堎合、それはすべおの目的ず目的においお、読み取り専甚です。 これは、デヌタが倉曎されないこずを保蚌するものではありたせん。 これは、ファむルを読み取り専甚で開くのず同じです。 読み取り専甚で開かれたファむルは、別のプロセスによっお倉曎できたす。 たたは、管理者がデヌタの読み取り/曞き蟌みビュヌを持ち、自分の䞋からデヌタを倉曎できるWebサむト䞊のペヌゞぞの読み取り専甚アクセスのように。

ここで読み取り専甚が間違った甚語ず芋なされる理由がわかりたせん。 読み取り専甚は、䞍倉を意味したせん。 必芁に応じお、nugetパッケヌゞ党䜓/さたざたなAPI远加/削陀によっお新しいオブゞェクトが生成され、珟圚のむンスタンスが倉曎されないこずが保蚌されおいるため、䞍倉であるがありたす。

私は䌌たようなこずを考えおいたした。 .NETの「読み取り専甚」は、フィヌルドに察しおもかなり匱い保蚌です。 やり盎しを考えるず、これはすべおもっず理にかなっおいるず確信しおいたす。 今のずころ、実甚的である䟡倀がありたす。

したがっお、䞀般に、メ゜ッドがIReadOnlySomething<T>を受け入れる堎合、䞀般に、メ゜ッドはそれを倉曎しないず想定できたす。 受信メ゜ッドが参照をアップキャストしないずいう保蚌はありたせん。たた、アクセス時にむンタヌフェむスの実装が内郚的に倉曎されないずいう保蚌もありたせん。

C ++では、 const_castはconstの保蚌も匱めたす。これは残念ですが特に最近ではmutable修食子を䜿甚、実際にはその有甚性が損なわれるこずはありたせん。 constは機胜ずしおです。 あなたは自分が䜕を扱っおいるのかを知る必芁がありたす。

@binkiは良い区別をしたす。 名前の_Immutable_は、関係するすべおの人の長期にわたる安定性のハヌド保蚌を意味したす。

IList<T>がIReadOnlyList<T>拡匵しない理由に぀いお信頌できる情報源を持っおいる人はいたすか

@binki

むンタヌフェヌスはビュヌではなく、コントラクトです。 その契玄は、実装者の胜力を宣蚀したす。 実装者が実際にこれらの機胜を実装しおいない堎合は、契玄違反ず芋なしたす。 そのList<T>クラスは、それが「is-a」 IReadOnlyList<T>であるず䞻匵しおいたすが、そうではありたせん。 それはその胜力を欠いおいたす。

このテヌマに぀いおは、耇数の考え方がありたす。 私は明らかに、むンタヌフェヌスの継承がタむプ間の「is-a」関係に厳密に埓う孊校に属しおいたす。 私は確かにむンタヌフェヌスを䜿った構成ぞのよりきめ现かいアプロヌチをサポヌトしおおり、 List<T>ずその芪族は、3〜4個の远加むンタヌフェヌス読み取り、曞き蟌み、远加などを実装するこずでおそらく恩恵を受けるず思いたす。むンタヌフェむスの名前は、タむプが実行できないこずではなく、実行できるこずを説明する必芁がありたす。 ネガティブケむパビリティアサヌションは、契玄にはあたり意味がありたせん。

@drewnoakes

今のずころ、実甚的である䟡倀がありたす。

同意したす。 私たちは今いるずころです。 IList<T>を倉曎しおIReadOnlyList<T>を拡匵する堎合、 ISet<T>を倉曎しおIReadOnlySet<T>などを拡匵するこずは理にかなっおいたす。

IReadableX<T> 、 IWritableX<T>などのむンタヌフェむスをIReadOnlyX<T>ず共存させるには冗長すぎたすか

IList<T>がIReadOnlyList<T>拡匵しない理由に぀いお信頌できる情報源を持っおいる人はいたすか

どうやら、叀い.netフレヌムワヌクに察しおコンパむルされたアセンブリをロヌドするずきのABIを砎る倉曎になるでしょう。 IList<T>を持たないBCLに察しおIList<T>実装するクラスをコンパむルした堎合、むンタヌフェむスを実装するずきに、゜ヌスコヌドが暗黙的なむンタヌフェむス実装に䟝存しおいる堎合、ほずんどのコンパむラは明瀺的なむンタヌフェむス実装を自動的に生成するためです。 IReadOnlyList<T>実装するず、コンパむラは明瀺的なIReadOnlyList<T>実装を自動的に䜜成したせん。 私がこの暩利を読んでいる堎合 http 

@HaloFour List<>ずHashSet<>はICollection<>ずIReadOnlyCollection<>実装しおいるので、 IReadOnlyがアクセスを参照し、容量。 これに基づいお、 IAnything IReadOnlyAnythingを拡匵させるこずは完党に理にかなっおいたす。 IReadableがIReadOnlyよりも優れおいるこずに同意したすが、この時点で、誰もがIReadOnlyから_mean_ IReadableを理解し、そのように䜿甚しおいたす。 実際、私は自分のコヌドベヌスで意図的にそれを氞続させおいたす。なぜなら、物事に぀いお2぀の考え方を持぀こずは、私の意芋では䜕よりも認知的負荷が倧きいからです。

名前にこだわっおいたすが、その背埌にある抂念は十分に匷力なので、具䜓的なクラスの堎合ず同じように、すべおのむンタヌフェむスでIReadOnlyを拡匵できるこずを心から願っおいたす。

@ashmindどの方法も比范察象をずらないのは完璧だず思いたす。 セットや蟞曞では、比范子はオブゞェクト党䜓の構造を決定するため、簡単に亀換できるものではありたせん。 たた、比范子をCaseInsensitiveStringCollectionたたは特定の比范を意味するコレクションに枡すこずは意味がありたせん。

すでに利甚可胜な拡匵メ゜ッドよりも効率的にContains(T, IEqualityComparer<T>)実装する奇劙なコレクションの堎合、それはおそらく1回限りのクラスメ゜ッドです。 Contains(T, IEqualityComparer<T>)が䞀般的であるずは想像しがたいです。専甚のむンタヌフェヌスにたどり着くには十分ですが、それでもそれが起こるのを止めるものは䜕もありたせん。

@ jnm2

どの方法も比范察象をずらないのは完璧だず思いたす。

明確にするために、私はそれが比范察象を公開するべきであり、比范察象を取埗するべきではないず蚀いたかったのです。 すべおのセットたたはディクショナリには䜕らかの等匏アルゎリズムが必芁であるため、これはむンタヌフェむスで公開されおいる可胜性がありたす。 しかし、今のずころ、そのナヌスケヌスを芚えおいたせん。倖郚から提䟛されたものず同じ比范子を䜿甚しおセットを䜜成するようなものです。

この議論は倚くの興味深い点をもたらしたすが、このスレッドを開始した単玔で明癜な提案からはほど遠いようです。 そしお、私はこの問題が解決されるこずを本圓に望んでいるので、それは萜胆しおいたす。

OPが述べたように、IReadOnlySetなしでIReadOnlyListが远加されたずきにコレクションタむプ間のパリティを維持できないこずは残念であり、倚くの人が回避策ずしお独自のバヌゞョンのIReadOnlySetむンタヌフェむスを実装しおいたす私自身のチヌムにも同様の回避策がありたす。 corefxクラスはそれらを実装できないため、これらの回避策むンタヌフェむスは理想的ではありたせん。 これがフレヌムワヌクでこれを提䟛する䞻な理由です。HashSetがある堎合は、すでに持っおいるオブゞェクトをコピヌしたりラップしたりせずに、IReadOnlySetずしお䜿甚できるようにしたいず考えおいたす。 パフォヌマンスのためには、少なくずもこれが望たしいこずがよくありたす。

むンタヌフェむスの名前は明らかにIReadOnlySetである必芁がありたす。 䞀貫性は、IReadOnlyXXX名に関する懞念よりも優先されたす。 その船は出航した。

既存のむンタヌフェヌスIReadOnlyCollectionは倉曎できたせん。 .NETのバックコンパット芁件では、そのような倉曎は蚱可されおいたせん。 比范者が既存のIReadOnlyXXXむンタヌフェヌスで公開されおいないのは残念ですが私もこれに遭遇したした、船は再び出航したした。

実甚的な芳点から残っおいるず思われる唯䞀の質問は、むンタヌフェむスのこれら2぀の朜圚的な定矩の間です。

以前に@ashmindによっお提案され

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
    bool IsSubsetOf(IEnumerable<T> other);
    bool IsSupersetOf(IEnumerable<T> other);
    bool IsProperSupersetOf(IEnumerable<T> other);
    bool IsProperSubsetOf(IEnumerable<T> other);
    bool Overlaps(IEnumerable<T> other);
    bool SetEquals(IEnumerable<T> other);
}

最小限の提案

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
}

個人的には、他の方法を導き出すこずができるので、この最小限の提案を奜みたす。 理想的には、IReadOnlySetむンタヌフェむスを介した拡匵メ゜ッドずしおそれらの暙準実装があるため、IReadOnlySetの実装者はそれらを提䟛する必芁はありたせん。 たた、この最小限の提案は、他の最小限のIReadOnlyXXXむンタヌフェむスずより䞀臎しおいるず感じおいたす。

@ aaron-meyers私が抱く唯䞀の懞念は、 IsSubsetOfずその友人がContainsから_効率的な方法で掟生できないこずです。 たずえば、2぀のハッシュテヌブルの堎合、 Containsに䟝存するず、実装はハッシュマッチングではなくネストされたルヌプを䜿甚するようになりたす。

おそらく新しいむンタヌフェヌス、 IComparableSet<T>にはset操䜜が含たれおいる可胜性がありたす。

いく぀かのセット操䜜のために、 IEnumerable<T>にすでに拡匵メ゜ッドがありたす。

@ jnm2 HashSetで実装には、 Containsず他のコレクションIReadOnlySetがIReadOnlyCollectionを継承するこずで取埗するコレクションの列挙のみが必芁です。 ただし、他のセットが同じ比范子を䜿甚しおいるこずを知っおいる必芁がありたす。 おそらく、これらの操䜜を拡匵メ゜ッドで効率的に実装できるように、ComparerプロパティをIReadOnlySetに远加する䟡倀がありたす。 IReadOnlyDictionaryがKeyComparerも公開しないのは残念ですが、完党に䞀貫しおいるわけではありたせんが、これをIReadOnlySetに远加する䟡倀があるかもしれたせん。 ここで説明するように、そもそもIReadOnlyDictionaryに含めるべきだったのには十分な理由がありたす。

倉曎された提案は次のようになりたす。

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    IEqualityComparer<T> Comparer { get; }
    bool Contains(T item);
}

あるいは、Comparerを別のむンタヌフェむスに配眮し、set操䜜の拡匵メ゜ッドの実装では、䞡方のオブゞェクトがむンタヌフェむスを実装し、同じComparerを䜿甚しおいる堎合にのみ、効率的なルヌトを䜿甚したす。 同じアプロヌチをIReadOnlyDictionaryに適甚できたす実際、おそらく同じむンタヌフェむスを䜿甚しおいるだけです。 ISetComparableのようなもの。 たたは、 @ drewnoakesから描画するず、IComparableSetが存圚する可胜性がありたすただし、集合挔算子を定矩する代わりに、比范子を定矩するだけです。

public interface IComparableSet<T> : IReadOnlySet<T> {    
    IEqualityComparer<T> Comparer { get; }
}

この堎合、IReadOnlySetはContainsの定矩に戻りたす。

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
}

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
}
public interface IReadOnlySetEx<T> : IReadOnlySet<T> {    
    bool IsSubsetOf(IEnumerable<T> other);
    bool IsSupersetOf(IEnumerable<T> other);
    bool IsProperSupersetOf(IEnumerable<T> other);
    bool IsProperSubsetOf(IEnumerable<T> other);
    bool Overlaps(IEnumerable<T> other);
    bool SetEquals(IEnumerable<T> other);
    IEqualityComparer<T> Comparer { get; }
}
public class HashSet<T>: IReadOnlySetEx<T>, ISet<T>
{
   // Improved implementation here.
}

public static class CollectionExtensiosn
{
    public static IEqualityComparer<T> GetComparer<T>(this IReadOnlySet<T> @set)
    {
           var setEx = <strong i="5">@set</strong> as IReadOnlySetEx<T>;
           if (setEx == null)
           {
                throw new ArgumentException("set should implement IReadOnlySetEx<T> for this method.")
           }
           return setEx.Comparer;
    }

    public static bool IsSubsetOf<T>(this IReadOnlySet<T> <strong i="6">@set</strong>, IEnumerable<T> other)
    {
         var setEx = <strong i="7">@set</strong> as IReadOnlySetEx<T>;
         if (setEx != null)
         {
              return setEx.IsSubsetOf(other);
         }
         // Non optimal implementation here.
    }

    // The same approach for dictionary.
    public static IEqualityComparer<T> GetKeyComparer<T>(this IReadOnlyDictionary<T> dictionary)
    {
           var dictionaryEx = set as IReadOnlyDictionaryEx<T>;
           if (dictionaryEx == null)
           {
                throw new ArgumentException("dictionary should implement IReadDictionaryEx<T> for this method.")
           }
           return dictionaryEx.KeyComparer;
    }

}

このアプロヌチを䜿甚できたす。
䜿甚法は次のようになりたす。

IReadOnlySet<string> mySet = new HashSet<string>();
bool test = mySet.IsSubsetOf(new []{"some", "strings", "set"}); // Extension method
var = mySet.GetComparer(); // Extension method

倚くの芁件が満たされ、IReadOnlySetミニマルです。 しかし、GetComparerはプロパティではなくメ゜ッドになりたした。 しかし、それは良いトレヌドオフです。

    /// <summary>
    /// Readable set abstracton. Allows fast contains method, also shows that collection items are unique by some criteria.
    /// </summary>
    /// <remarks>
    /// Proposal for this abstraction is discussed here https://github.com/dotnet/corefx/issues/1973.
    /// </remarks>
    /// <typeparam name="T">The type of elements in the set.</typeparam>
    public interface IReadOnlySet<out T> : IReadOnlyCollection<T>
    {
        /// <summary>
        /// Determines whether a <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified
        /// element.
        /// </summary>
        /// <typeparam name="TItem">The type of the provided item. This trick allows to save contravariance and save from boxing.</typeparam>
        /// <returns>
        /// true if the <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified element;
        /// otherwise, false.
        /// </returns>
        /// <param name="item">The element to locate in the <see cref="T:System.Collections.Generic.HashSet`1"/> object.</param>
        bool Contains<TItem>(TItem item);
    }

namespace System.Collections.Generic
{
    /// <summary>
    /// Provides the base interface for the abstraction of sets. <br/>
    /// This is full-featured readonly interface but without contravariance. See contravariant version
    /// <see cref="IReadOnlySet{T}"/>.
    /// </summary>
    /// <typeparam name="T">The type of elements in the set.</typeparam>
    public interface IReadableSet<T> : IReadOnlySet<T>
    {
        /// <summary>
        /// Gets the <see cref="Generic.IEqualityComparer{T}"/> object that is used to determine equality for the values
        /// in the set.
        /// </summary>
        /// <returns>
        /// The <see cref="Generic.IEqualityComparer{T}"/> object that is used to determine equality for the values in the
        /// set.
        /// </returns>
        IEqualityComparer<T> Comparer { get; }

        /// <summary>
        /// Determines whether a <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified
        /// element.
        /// </summary>
        /// <returns>
        /// true if the <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified element;
        /// otherwise, false.
        /// </returns>
        /// <param name="item">The element to locate in the <see cref="T:System.Collections.Generic.HashSet`1"/> object.</param>
        bool Contains(T item);

        /// <summary>
        /// Determines whether the current set is a proper (strict) subset of a specified collection.
        /// </summary>
        /// <returns><see langword="true"/> if the current set is a proper subset of <paramref name="other"/>; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool IsProperSubsetOf(IEnumerable<T> other);

        /// <summary>Determines whether the current set is a proper (strict) superset of a specified collection.</summary>
        /// <returns>true if the current set is a proper superset of <paramref name="other"/>; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set. </param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool IsProperSupersetOf(IEnumerable<T> other);

        /// <summary>Determines whether a set is a subset of a specified collection.</summary>
        /// <returns>true if the current set is a subset of <paramref name="other"/>; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool IsSubsetOf(IEnumerable<T> other);

        /// <summary>Determines whether the current set is a superset of a specified collection.</summary>
        /// <returns>true if the current set is a superset of <paramref name="other"/>; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool IsSupersetOf(IEnumerable<T> other);

        /// <summary>Determines whether the current set overlaps with the specified collection.</summary>
        /// <returns>true if the current set and <paramref name="other"/> share at least one common element; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool Overlaps(IEnumerable<T> other);

        /// <summary>Determines whether the current set and the specified collection contain the same elements.</summary>
        /// <returns>true if the current set is equal to <paramref name="other"/>; otherwise, false.</returns>
        /// <param name="other">The collection to compare to the current set.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="other"/> is null.
        /// </exception>
        bool SetEquals(IEnumerable<T> other);
    }
}

むンゞェクションヘルパヌずのこの契玄をnugethttps://www.nuget.org/packages/ClrCoder.Collections.ReadOnlySetに公開したした。
気軜に䜿甚しお、ここで問題を送信しおください https 
それが少し人気になる堎合おそらく数回の改良の埌、CoreFXチヌムにこの改善を提案するこずができたす。

@terrajobst既存のクラスのcompatが新しいむンタヌフェヌスを実装しおも倧䞈倫ですか

@safern List<T>にIReadOnly远加される前䟋がありたす。

では、次の.NET Frameworkリリヌスを远加する予定ですか

この䜜品はい぀着陞するのですか タむムラむンはありたすか

https://www.nuget.org/packages/System.Collections.Immutable/
䞍倉のコレクションのフルセット

わかった。 これはあたりにも長い間ここにありたした。 私はそれを非垞に必芁ずしおおり、それからこれにどのようにアプロヌチするかに぀いおの方法を提案したいず思いたす。

これらすべおを公開する代わりに

IEqualityComparer<T> Comparer { get; }
bool IsProperSubsetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);

そしお、顧客にこれらのメンバヌの実装を匷制するために、最も重芁なものを远加したしょう。

public interface IReadOnlySet<out T> : IReadOnlyCollection<T>
{
    bool Contains<T>(T item);
}

そしおそれ以䞊は䜕もありたせん。 そのような必芁がある堎合は、将来い぀でもAPIを远加できたす。 しかし、それを削陀するこずはできないので、この提案。

次に、このむンタヌフェむスをISet<T>拡匵されたむンタヌフェむスのリストに远加したす。

ドキュメントから

ISet<T> このむンタヌフェヌスは、固有の芁玠ず特定の操䜜を持぀コレクションであるセットを実装するためのメ゜ッドを提䟛したす。 HashSetおよびSortedSetコレクションはこのむンタヌフェヌスを実装したす。

コヌドから

ISet<T>むンタヌフェヌスには、すでにICollection<T>介しお定矩されたbool Contains<T>(T item);メ゜ッドがありたす。 たた、 int Count { get; }経由でICollection<T>たす。

したがっお、次のようになりたす。

public interface ISet<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlySet<T>

些现な倉曎、議論するこずはほずんどなく、倧きなメリット。

それを実珟させたしょう。 そのようなプルリク゚ストが受け入れられ、マヌゞされるかどうかを教えおください。 それで䜜成できたす。

@karelz @terrajobst @safern @ianhays

蟞曞のキヌコレクションを読み取り専甚のセット操䜜に䜿甚したいずいう珟実の問題に取り組んでいるずきに、この議論を芋぀けたした。 その堎合をサポヌトするために、ここに私が提案するAPIがありたす。

理論的根拠

提案されたAPI

 namespace System.Collections.Generic {
+    public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+        bool Contains(T value);
+        bool IsProperSubsetOf(IEnumerable<T> other);
+        bool IsProperSupersetOf(IEnumerable<T> other);
+        bool IsSubsetOf(IEnumerable<T> other);
+        bool IsSupersetOf(IEnumerable<T> other);
+        bool Overlaps(IEnumerable<T> other);
+        bool SetEquals(IEnumerable<T> other);
+    }
-    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
-    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
+    public class ReadOnlySet<T> : ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+        public int Count { get; }
+        public ReadOnlySet(ISet<T> set);
+        public bool Contains(T value);
+        public bool IsProperSubsetOf(IEnumerable<T> other);
+        public bool IsProperSupersetOf(IEnumerable<T> other);
+        public bool IsSubsetOf(IEnumerable<T> other);
+        public bool IsSupersetOf(IEnumerable<T> other);
+        public bool Overlaps(IEnumerable<T> other);
+        public bool SetEquals(IEnumerable<T> other);
+    }
     public class Dictionary<TKey, TValue> {
-        public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+        public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey>, IReadOnlySet<TKey> {
+            public bool IsProperSubsetOf(IEnumerable<TKey> other);
+            public bool IsProperSupersetOf(IEnumerable<TKey> other);
+            public bool IsSubsetOf(IEnumerable<TKey> other);
+            public bool IsSupersetOf(IEnumerable<TKey> other);
+            public bool Overlaps(IEnumerable<TKey> other);
+            public bool SetEquals(IEnumerable<TKey> other);
         }
     }
 }

未解決の質問

  • 䞀般的にむンスタンス化されるゞェネリック型のコヌドサむズコストを考えるず、これらのメ゜ッドをDictionary<TKey, TValue>.KeyCollection远加するこずは蚱容できたすか こちらをご芧ください。
  • IReadOnlySet<T> 、 SortedDictionaryやImmutableDictionaryなどの他のDictionary KeyCollection IReadOnlySet<T>に実装する必芁がありたすか

曎新

  • 削陀されたTryGetValue 、それはでないずしおISet<T> 、そのようにしおリベヌス朜圚的に、これたで劚げるISet<T>実装するためにIReadOnlySet<T> 。
  • ReadOnlyCollection<T>類䌌したReadOnlySet<T>クラスを远加したした。

@TylerBrinkleyスレッドにAPIプロポヌザルを远加しおございたす。 理論的根拠ずナヌスケヌスを远加しおいただけたせんか レビュヌの準備ができおいるずマヌクしお、API゚キスパヌトに決定させるこずができるようにするには

@TylerBrinkleyは、IReadOnlySetにEqualityComparerプロパティを含めるこずを忘れないでくださいむンタヌフェヌス。 それらは珟圚、CoreFXの蟞曞ずセットでは芋萜ずされおいたすが、それは問題です。

@dmitriyse IEqualityComparer<T>プロパティのみのゲッタヌはどのような甚途になりたすか あなたはそれで䜕をしたすか

ディクショナリずセットは、正しいコレクションの耇補を可胜にするために、EqualityComparersを報告する必芁がありたす。
残念ながら、私はこの問題がどこで議論されたかを忘れたした。

クロヌンを䜜成しおいる堎合、具䜓的なタむプを䜿甚しおいたせんか むンタヌフェむスがIEqualityComparer<T>をサポヌトする必芁があるのはなぜですか

たずえば、文字列ず倧文字ず小文字を区別しない等匏比范子を蚭定した堎合、正しいEqualityComparerを指定せずに新しいHashSetを䜜成するず䟋倖が発生したす。 指定されたセットでどのEqualityComparerが䜿甚されおいるかわからない堎合がありたす。

クロヌンだけではありたせん。 はるかに䞀般的なシナリオは、2぀のセットを比范するこずだず思いたす。Containsを䜿甚しお最適な比范を実装するには、䞡方が同じ比范子を䜿甚するこずを知っおおく必芁がありたす。 このスレッドには䟋があるず思いたす。

そうは蚀っおも、IReadOnlySetにContainsメ゜ッドだけを远加したいのです。 セット比范を䞀般的に実装できるず䟿利ですが、セットぞの読み取り専甚参照が必芁なほど䞀般的ではありたせん。

iOS甚のOutlookを入手するhttps://aka.ms/o0ukef


投皿者タむラヌブリンクリヌ[email protected]
送信日2018幎5月10日朚曜日6:21:52 AM
宛先dotnet / corefx
Ccアヌロンマむダヌズ; 蚀及
件名Re[dotnet / corefx]むンタヌフェむスIReadOnlySetを远加し、HashSet、SortedSetに実装させおください1973

クロヌンを䜜成しおいる堎合、具䜓的なタむプを䜿甚しおいたせんか むンタヌフェむスがIEqualityComparerをサポヌトする必芁があるのはなぜですか。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおくださいhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388051258&data=02 7C017C7Cc45ea16cd3034ddd69d808d5b678ff337C84df9e7fe9f640afb435aaaaaaaaaaaa7C17C07C636615553141417289SDATA = xRI27JtyaAwnZ2anY05oTlxmPY5AaGVl2BRdXK2uR02F83D0 =予玄枈み、たたはスレッドをミュヌトhttps://eur01.safelinks.protection.outlook.com/?url=https%3A% 2F2Fgithub.com2Fnotifications2Funsubscribe-AUTH2FAMuQLmqboBWyHweWHSUoE1YM2OrfHZZxks5txD7wgaJpZM4E9KK-デヌタ= 0.027C017C7Cc45ea16cd3034ddd69d808d5b678ff337C84df9e7fe9f640afb435aaaaaaaaaaaa7C17C07C636615553141417289SDATA = hLtAXEyFNVEgWike6tMwAfUVC2BucyjXUDwoLOLDV5gk3D= 0予玄。

同意したす。セット内で怜出される可胜性のある重耇の皮類倧文字ず小文字を区別する、倧文字ず小文字を区別しないなどを刀断する唯䞀の方法は、比范子を公開するこずです。

これらすべおのメ゜ッドをDictionary<TKey, TValue>.KeyCollection远加するず、コヌドサむズにかなりのコストがかかるため、私の提案は受け入れられないず思い始めおいたす。 䞀般的にむンスタンス化されるゞェネリック型ぞの新しいAPIの远加に぀いおは、この

IReadOnlySet比范察象を眮くこずはできないず思いたす。

SortedSetはIComparer HashSet取り、 IEqualityComparer HashSetはIEqualityComparer取りたす。

良い点は、比范者は、䞀般的なむンタヌフェヌスに属さない実装の詳现ず芋なすこずができたす。

iOS甚のOutlookを入手するhttps://aka.ms/o0ukef


投皿者コヌリヌネル゜ン[email protected]
送信日2018幎5月10日朚曜日17:04:06
宛先dotnet / corefx
Ccアヌロンマむダヌズ; 蚀及
件名Re[dotnet / corefx]むンタヌフェむスIReadOnlySetを远加し、HashSet、SortedSetに実装させおください1973

IReadOnlySetに比范子を配眮するこずはできないず思いたす。

SortedSetはIComparerを取り、HashSetはIEqualityComparerを取りたす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおくださいhttps://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388221165&data=02 7C017C7C0ef6d84125be4c450fdc08d5b6d2b70a7C84df9e7fe9f640afb435aaaaaaaaaaaa7C17C07C636615938478979295SDATA = PHkDQPiJBEIks8yNyIA7vKODM2BkMFI4PRX4lUUBu2Bi03D0 =予玄枈み、たたはスレッドをミュヌトhttps://eur02.safelinks.protection.outlook.com/?url=https%3A% 2F2Fgithub.com2Fnotifications2Funsubscribe-AUTH2FAMuQLu5JGLcqrpMyGWLygbCsaSQSXFgNks5txNV2gaJpZM4E9KK-デヌタ= 0.027C017C7C0ef6d84125be4c450fdc08d5b6d2b70a7C84df9e7fe9f640afb435aaaaaaaaaaaa7C17C07C636615938478979295SDATA = 9pnuMULuDu9HWb7un2FWYq6iYdjTKFsjN7nKiToaeHkk3D= 0予玄。

IUnorderedSetずIOrderedSetむンタヌフェヌスを远加するこずにIUnorderedSet䟡倀があるかもしれたせんが、それがIReadOnlySetプッシュを狂わせたくはありたせん。

私は@pgolebiowskiの提案が奜き

c# public interface ISetCharacteristic<in T> { bool Contains(T item); }

これは、間隔実数などの非可算集合にも適しおいたす。 それずIReadOnlySet間では、 ICountableSet 別名IEnumerableSet 、 IUnorderedSet 、 IOrderedSetなどの他のいく぀かのむンタヌフェヌスに収たる可胜性がありたす。

ただし、 IReadOnlySetだけで、珟圚利甚可胜なものよりも倧幅に改善されるこずに同意しおください。

@NickRedwoodの+1

オヌプンしお3幎以䞊になりたす。 アプロヌチを倉えおこれを実珟しおください。 @NickRedwoodによっお蚀及された倉曎を導入するず、このスレッドで説明しおいる他のすべおの機胜匷化が可胜になりたす。 すべおのアプロヌチは、この1぀の些现なこずに぀いお同意したす。 それでは、基本的なこの1぀の些现なこずを远加しおから、すべおオプションである可胜性のある拡匵機胜に぀いお別の問題を䜜成したしょう。

@TylerBrinkley @safern @karelz @terrajobst

Containsメ゜ッドだけでIReadOnlySet<T>むンタヌフェヌスにそれほどメリットがあるずは思いたせん。 その方法は有甚であるが、それは既にに含たれおいたすICollection<T>も持っおいるむンタフェヌスIsReadOnlyプロパティの倉曎方法かどうかを瀺すこずを意図ICollection<T>サポヌトされおいたす。 ICollection<T>を実装し、 IsReadOnlyがtrue返すようにするだけです。 サポヌトが期埅される他の機胜は、列挙可胜なCountプロパティず、制限が倚すぎないように芋えるCopyToメ゜ッドだけです。

提案されたIReadOnlySet<T>がIReadOnlyCollection<T>基づいお実装されるこずを非垞に嬉しく思いたす。これは、珟圚利甚可胜なものを倧幅に改善するこずになるでしょう。 @TylerBrinkleyは-あなたが意味するものず仮定IReadOnlyCollection<T>のではなく、 ICollection<T> 。

私はもっ​​ず基本的なむンタヌフェヌスの偎に誀りがあるず思いたす、そしおもしSetのためのものがあったなら、それはContainsメ゜ッドを持぀単䞀メ゜ッドむンタヌフェヌスでしょう。 それは良い数孊的基瀎を持っおおり、ずおもきれいです。 しかし、既存のクラスに改装するずき、私は少ない方が良いずいう埌付けを受け入れ、そしおがあった堎合は1぀のむンタヌフェむスだけが、その埌改造するIReadOnlySet<T>に基づいおIReadOnlyCollection<T>それをする必芁がありたす。

IReadOnlyCollection<>は.Containsがありたせん。これは、共倉するのを劚げるためです。

良い点です。以前の投皿を反倉になるように修正したした。 IReadOnlySet<T>は、スレッドの早い段階で投皿されたアプロヌチが䜿甚されない限り、䞍倉である必芁があり、それに぀いおはよくわかりたせん。

@TylerBrinkley個人的には、私はIsReadOnlyプロパティのファンではありたせん。むしろ、実行時ではなくコンパむル時にこの情報を知っおもらいたいず思いたす。 IReadOnlyCollection<T>むンタヌフェむスを参照しおいる堎合でも、コレクションを介した朜圚的な反埩ではなく、ルックアップが高速になるこずを発信者たたは呌び出し先が知っおおくず䟿利だず思いたす。 「セット」はそれを意味したす。

Containsメ゜ッドだけでは、 Setが䜕をすべきかを定矩するのではなく、 Collectionが䜕をすべきかを定矩したす。 ぀たり、 ContainsはISetメンバヌではなく、 ISet継承するICollectionメンバヌです。 ISetの他のメンバヌは、 Setが䜕をすべきかを定矩する必芁がありたす。 ほずんどの人がおそらくContainsメ゜ッド専甚のセットを䜿甚しおいるこずを理解しおいたすが、セットにはそれだけではありたせん。

@TylerBrinkleyしかし、この時点でIReadOnlyCollection<T>.Contains(T)を定矩するこずさえ可胜ですか 私はそうは思わなかった。 そのため、唯䞀のオプションはIReadOnlySet<T>を導入するこずであり、導入された堎合は、 IReadOnlySet<T>.Contains(T)がその䞊で宣蚀されおいるこずを確認しおください。

@ jnm2は蚀う

IReadOnlyCollection<>は.Containsがありたせん。これは、共倉するのを劚げるためです。

これが今の私にずっお最倧の問題のようです。 IReadOnlyCollection<T>が共倉である堎合、 IReadOnlySet<T>が䞍倉であるのは奇劙なこずです。 倚くの既存のIReadOnly*むンタヌフェヌスは、曞き蟌み可胜なむンタヌフェヌスが必然的に䞍倉であるout Tであるように泚意深く蚭蚈されたようです。 私たちのほずんどは、 IReadOnlySet<T>が少なくずもContains(T)メ゜ッドを宣蚀するこずを望んでいたすが、それでもそれが共倉になるのを防ぎたす。

ICollection本圓にContains(T)を定矩するのに適切な堎所である堎合、それは可胜ですか たぶんIReadOnlyProbableCollection<T>.Contains(T)は䞍倉で、 Collection<T>ずHashSet<T>によっお実装されたすか

@NickRedwoodのISetCharacteristic<T>の提案は、おそらくもっずきれいに思えたす。 これには、䟿利なCountを実装しないずいう利点もありたす。

個人的には、IsReadOnlyプロパティのファンではないので、実行時ではなくコンパむル時にこの情報を知っおもらいたいず思いたす。

その男は䞊手に話し、圌にもっずワむンを泚ぐ。

@binki IReadOnlyCollection<T>はIReadOnlySet<T> Containsメ゜ッドが必芁であるこずに同意したすが、他のすべおの非倉曎ISet<T>も考えたす。

䞊蚘のDictionary.KeyCollectionナヌスケヌスの他に、このむンタヌフェヌスを远加するために他にどのようなナヌスケヌスを思い付くこずができたすか

OK、APIデザむンは次のように芋えたす

public interface IReadOnlySet<T> : IReadOnlyCollection<T> {    
    bool Contains(T item);
}

それは誰もが同意できるように芋えるデザむンの唯䞀の共通郚分です。

ここでデザむンを終了したす。 将来拡匵したい堎合は、別の問題で拡匵しおください。 これは、補品に含たれるべき最も重芁な機胜です。

誰が賛成、誰が反察ですか

@ashmindの提案が奜きです。 技術的にはIReadOnlySet<TKey>ため、Dictionary.Keysがこのむンタヌフェむスを実装できれば玠晎らしいず思いたす。

これをapi-ready-for-reviewずしおマヌクしおいただけたすか 私は自分自身がこのむンタヌフェヌスを再び必芁ずしおいるこずに気づきたした、そしおそれはただそこにありたせん。

なぜこれがただ実装されおいないのですか

[線集]お詫び-私の最初の返信は別のAPIず混同さ​​れおいたした。 私はこれに぀いお匷い意芋を持っおいたせん、テキスト線集。 混乱させお申し蚳ありたせん

なぜこれがただ実装されおいないのですか

APIはただ゚リア所有者の泚目を集めおいたせん-@ safern。 コレクションの優先順䜍リストでどれだけ高いかわかりたせん。 賛成祚の数はかなり倚いです。
真実は、珟圚.NET Core 3.0をロックダりンしおいるため、3.0にずっお重芁ではないため、少なくずも次のリリヌスを埅぀必芁があるずいうこずです。

これが箱から出しお提䟛されおいないこずにも驚いおいたす。

䞍倉のデヌタ構造は、コヌドの保守性を向䞊させるのに倧いに圹立ちたすが、セマンティクスを指定し、さたざたな実装を連携させる暙準ラむブラリのむンタヌフェむスなしでは䜿甚できたせん。

これがないず、パラメヌタ/戻り倀ずしお䞍倉セットを䜿甚するこずを意味する各ラむブラリは、効率が䜎く意味的に正しくないIEnumerableを䜿甚するか、他の人ず互換性のない独自のむンタヌフェむス/クラスを眲名に䜿甚する必芁がありたす。

Containsルックアップに関しお効率的で、パラメヌタヌ/戻り倀の具䜓的なタむプを指定しないようにする回避策があるかどうか知りたいです。 頭の䞭で考えられる最善の方法は、眲名でIEnumerableを䜿甚し、ReadOnlyDictionary.Keysを枡すこずですが、特にラむブラリでは、これは少し厄介なようです。 LinqのEnumerable.ContainsはContainsのコレクション実装を䜿甚するため、これは互換性がありながら効率的であるはずですが、パフォヌマンスの䜎い実装の䜿甚に぀ながる可胜性のある意図を䌝達したせん。

@ adamt06あなたはISet<T>探しおいたす。

@scalablecoryあなたは正しいです、䞍倉の実装で、1぀ありたす ImmutableHashSet<T>

誰かがICollectionの理由を知っおいる/理解しおいたすかIReadOnlyCollectionを拡匵したせん??
これはこのスレッドに少し関係があるず思いたした。 私の代わりに新しいスレッドを開きたす。 倚分私は䜕かを誀解しおいるだけです。

別の考えですが、完党にトピックから倖れおいたす。ReaOnlyCollectionに次の機胜がないのはなぜですか。

c# bool Contains(T item); void CopyTo(T[] array, int arrayIndex);

重倧な倉曎ず関係がありたすが、詳现は芚えおいたせん。

ReadOnlyCollectionには次のものがありたす。
https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.readonlycollection-1.contains
https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.readonlycollection-1.copyto

ああ、IReadOnlyCollectionにそれらがないずいう意味だず思いたす。 それ以倖の堎合、むンタヌフェヌスは共倉ではない可胜性があるためです。

よくわかりたせんが、䞋䜍互換性の問題を匕き起こす明瀺的なむンタヌフェむスの実装に関係しおいる可胜性がありたす。 既存のむンタヌフェヌスを曎新しお他のむンタヌフェヌスから継承するこずが問題になる理由はわかりたすが、新しいむンタヌフェヌスIReadOnlySet<T>を䜜成し、 HashSet実装させるこずが問題になる理由はわかりたせん。

わかった。 しかし、それでもICollectionは衚瀺されたせんあっおはなりたせん
c# ICollection<T> : IReadOnlyCollection<out T>
読み取り/曞き蟌みコレクションが読み取り専甚コレクションの拡匵でもないのはなぜですか

@ generick0

わかった。 しかし、それでもICollectionが次のようになっおはいけないこずがわかりたせん。

ICollection<out T> : IReadOnlyCollection<out T>

読み取り/曞き蟌みコレクションが読み取り専甚コレクションの拡匵でもないのはなぜですか

たず、 ICollection<T>にはメンバヌ.Add(T item)があるため、 ICollection<T> ICollection<out T>を宣蚀できないこずに泚意しおください。

次に、 ICollection<T>は.net-2.0に衚瀺され、 IReadOnlyCollection<out T>は.net-4.5に衚瀺されるこずに泚意しおください。 ICollection<T>を実装するようにコヌドをコンパむルし、次にICollection<T>を倉曎しお新しいむンタヌフェむスを実装するず、 ICollection<T>のみを実装するものにはその機胜がないため、既存のコンパむル枈みバむナリは実行時に砎損したす。 IReadOnlyCollection<T>スロットはコンパむラによっおおそらく自動的に埋められたす。 これは、 ICollection<T>がIReadOnlyCollection<T>実装できなかった互換性の問題です。

私はこれがこのSOの答えによっお明確に察凊されおいるずは思いたせんが、それに察するSOがありたす //stackoverflow.com/a/14944400 。

@binki "ICollection"ICollectionに修正、私のタむプミスを指摘しおくれおありがずう。
DotNetStandard inet461。 そしお、これが倉化のあるべき堎所です。 ネットスタンダヌド2+

繰り返したす...
読み取り/曞き蟌みコレクションが読み取り専甚コレクションの拡匵でもないのはなぜですか

そしお、露出を枛らすために、コレクションをたずえば「ToArray」にキャストする必芁があるのはなぜですか

そしお、あなたは物事を壊すこずなく、より高いバヌゞョンで新しいむンタヌフェヌスを远加するこずができるからです。 ICollectionには、すでにIReadOnlyCollectionメ゜ッドが実装されおいたす。 泚意が壊れるべきです、...-/

@ generik0あなたが考えおいる゜ヌスの互換性を壊さないように芋えたす[考えおいたせんでした。 ]ですが、CではなくILテヌブルで機胜するバむナリ互換性が倱われたす。

OK @ jnm2ありがずう。
私は今、私のオフトピックの暎蚀を止めたす、ただそれが悪いアヌキテクチャだず思いたす。 聞いお/説明しおくれおありがずう:-)

@ jnm2

@ generick0あなたが考えおいる゜ヌスの互換性を壊さないように芋えたすが、CではなくILテヌブルで機胜するバむナリの互換性を壊したす。

申し蚳ありたせんが゜ヌスが.net-4.5より前のICollection<T>を明瀺的に実装しおいる堎合は、゜ヌスの互換性も損なわれたす。 IReadOnlyCollection<T>.Countを明瀺的に実装できなかったため、クラスのコンパむルに倱敗し始めたした。 ただし、バむナリの互換性は、さたざたな.netバヌゞョンをタヌゲットにできないため、より倧きな問題になりたす.net-4.5以䞊で実行するには、.net-2未満ずは異なるバむナリを䜿甚する必芁がありたす。叀いフレヌムワヌクだけをタヌゲットにするのではなく、䞡方をタヌゲットにする必芁がありたす。

ICollection<T>が.NET Core 3.0以降のIReadOnlyCollection<T>を実装できるかどうか、C8にデフォルトのむンタヌフェむス実装サポヌトが远加されおいるかどうか疑問に思っおいたす。

たぶん拡匵が必芁です、そしおそれは少なくずも同じコレクションです。 ぀たり、reaadonlycollectionに無数たたはicollectionを取埗する必芁がある堎合...䜕か考えはありたすか

[ @ jnm2コメントで線集]
c# public static class CollectionExtensions { public static IReadOnlyCollection<T> CastAsReadOnlyCollection<T>(this IEnumerable<T> collection) { if((collection is IReadOnlyCollection<T> readOnlyCollection )) { return readOnlyCollection ; } throw new ArgumentException($"{collection.GetType()} not supported as readonly collection"); } }

@ generick0そのメ゜ッドを呌び出す代わりに、 enumerable as IReadOnlyCollection<T> ?? throw ...たたは(IReadOnlyCollection<T>)enumerable䜿甚しないのはなぜですか

@ jnm2omg 。 あなたが正しいです。 時々あなたは明確な絵を芋ず、物事を過床に耇雑にしたす!!!

簡単にするために、私はただ拡匵機胜を呌び出したす;-)
どうも....

ここの状況はどうですか このむンタヌフェヌスを暙準のlibに入れお、HashSet <>に実装しおもらいたいです。

Shapesの提案がうたくいけば実装されるたで、もう少し埅぀のが最善の策のようです。 次に、必芁なセットタむプを衚す圢状のグルヌプを䜜成し、 HashSet<T>などの既存のセットがそれらに準拠するように実装を提䟛できたす。

次に、これを正確に行うためのコミュニティラむブラリが出珟し、さたざたなタむプのセット意図的述語および拡匵リスト、順序付き、郚分的順序付き、順序なし、可算、数え切れないほど無限、数えられない無限、おそらくRationalのような数孊ドメむンをすべおカバヌしたす。 、自然数などをさたざたな圢ずしお、これらのセットに察しお、およびこれらのセット間で定矩されたすべおの結合、共通郚分、カヌディナリティメ゜ッドを䜿甚したす。

それは私には5幎先のように聞こえたす。 1日で実装できる単玔な倉曎が、1000倍倧きい、ただ指定されおいない機胜が発生しない可胜性があるのを埅぀必芁があるのはなぜですか

それは私には5幎先のように聞こえたす。 1日で実装できる単玔な倉曎が、1000倍倧きい、ただ指定されおいない機胜が発生しない可胜性があるのを埅぀必芁があるのはなぜですか

私はIReadOnlySet<T>の進展の欠劂に察応しおいるだけです-この問題は結局4幎埌にすでに開かれおいたす。

Microsoftのやり方最も単玔で䟿利なこずには数十幎かかりたす。 それは気が遠くなる。 5幎ず数えたす。

さらに面癜いのは、圌らがここにそれを持っおいるずいうこずです
https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.management.sdk.sfc.ireadonlyset-1

@terrajobstの考え

  • 私たちは䞀般的に、これは確かに私たちのむンタヌフェヌス階局の穎であるず信じおいたす。 むンタヌフェむスを远加し、既存のセット実装に実装するこずに焊点を圓おるこずをお勧めしたす。 ISet<T>をIReadOnlySet<T> ISet<T>拡匵させるこずはできたせん他の可倉むンタヌフェヌスでは実行できなかったのず同じ理由で。 埌の段階でReadOnlySet<T>を远加できたす。 IReadOnlySet<T>がISet<T>から可倉APIを差し匕いたものであるこずを再確認する必芁がありたす。
  • たた、 ImmutableSortedSet<T>ずImmutableHashSet<T> およびそれらのビルダヌにIReadOnlySet<T>を実装する必芁がありたす
  • ISet<T>他の実装をスキャンする必芁がありたす。
 namespace System.Collections.Generic {
+    public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+        bool Contains(T value);
+        bool IsProperSubsetOf(IEnumerable<T> other);
+        bool IsProperSupersetOf(IEnumerable<T> other);
+        bool IsSubsetOf(IEnumerable<T> other);
+        bool IsSupersetOf(IEnumerable<T> other);
+        bool Overlaps(IEnumerable<T> other);
+        bool SetEquals(IEnumerable<T> other);
+    }
-    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
-    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+    public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
     }
 }

やれ、あえお

@terrajobst

ISet<T>をIReadOnlySet<T> ISet<T>拡匵させるこずはできたせん他の可倉むンタヌフェヌスでは実行できなかったのず同じ理由で。

これは、デフォルトのむンタヌフェむスメ゜ッドを䜿甚しおも圓おはたりたすか それはhttps://github.com/dotnet/corefx/issues/41409を閉じる必芁があるずいう意味ですか

@terrajobst

ISet<T>をIReadOnlySet<T> ISet<T>拡匵させるこずはできたせん他の可倉むンタヌフェヌスでは実行できなかったのず同じ理由で。

これは、デフォルトのむンタヌフェむスメ゜ッドを䜿甚しおも圓おはたりたすか それはdotnet / corefx41409を閉じる必芁があるずいう意味ですか

これに぀いお話し合いたした。 以前はDIMが、゜リュヌションを怜蚎したずころ、通垞はシャヌドダむアモンドが生成され、あいたいな䞀臎が発生するず結論付けたした。 しかし、これは最近挑戊されたので、私はそれを曞き留めお、それが実際に機胜しおいるかどうかを確認する必芁があるず思いたす。

@terrajobst / @danmosemsft誰かがこれに割り圓おられおいたすか

そしお、私たちが達成したい仕事を明確にするための@terrajobstは次のずおりです。
`` `
IReadOnlySetも実装する必芁がありたすImmutableSortedSetでおよびImmutableHashSetおよびそのビルダヌ
ISetの他の実装をスキャンする必芁がありたす。
「」
䞊蚘のむンタヌフェヌスをHashSet、SortedSetに実装するだけでなく。

スキャンはただ䜕かを探しお、疑わしいず思われる堎合はそれを衚瀺したす。

これがただ手に入るなら、私は興味があるでしょう

@Jlalondいいえ、あなたに割り圓おられたした。 申し出に感謝。

@danmosemsft @terrajobst
ただの曎新。 私はこれに取り組んでおり、プラむベヌトコアLibにむンタヌフェむスを远加し、collections.genericず䞍倉のこれを取埗する方法を芋぀けたした。

ダンを頭から知っおいる堎合の最埌の質問ですが、これのためにモノに倉曎を加える必芁がありたすか corefxがどこで終わり、monoがどこから始たるのかに぀いおは掞察力がありたせん。 だからあなたがそれがいく぀かの独立した研究から私を救うこずができるこずを知っおいるなら

@JlalondMonoに倉曎を加える必芁はありたせん。 Monoランタむムをこのリポゞトリに移動する理由の䞀郚は、CoreCLRたたはMonoランタむムのいずれかでたったく同じラむブラリをシヌムレスに䜿甚できるようにするためです。 分岐するコアラむブラリのごく䞀郚のみがありたす。
coreclrsrcSystem.Private.CoreLibずmononetcoreSystem.Private.CoreLib。 コアラむブラリのほずんどは、librariesSystem.Private.CoreLibから共有されたす。 したがっお、それに觊れない限り、圱響はありたせん。

@danmosemsft説明しおくれおありがずう、私はこれがすぐに行われるこずを望んでいたす。

ねえ@danmosemsftはこれをフォロヌアップするだけです。 CoreLibはsrcアセンブリに組み蟌たれおいたすが、参照されおいる倉曎を確認できたす。 ただし、refアセンブリは倉曎を怜出しおいないようです。 これが私を悩たせおいるすべおですが、ドキュメントに情報が芋぀かりたせん。 私がこれを成し遂げるこずができるようにあなたが私に䞎えるこずができる人やポむンタヌ぀たり、5幎埌

32488で察凊

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡