Runtime: рдХреГрдкрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IReadOnlySet рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣реИрд╢рд╕реЗрдЯ рдмрдирд╛рдПрдВ, рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЬреВрди 2015  ┬╖  104рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

рдореВрд▓

рдЪреВрдВрдХрд┐ IReadOnlyList рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛,

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдЕрдЬреНрдЮреЗрдп рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛: "рдпрд╣рд╛рдВ рдпрд╣ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдЗрдЯрдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ"ред

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

SQL рд╕рд░реНрд╡рд░: https://msdn.microsoft.com/en-us/library/gg503096.aspx
рд░реЛрд╕рд▓рд┐рди: https://github.com/dotnet/roslyn/blob/master/src/Compilers/Core/Portable/InternalUtilities/IReadOnlySet.cs
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рд▓рдбрд╝рдХреЗ: http://blogs.msdn.com/b/bclteam/archive/2013/03/06/update-to-immutable-collections.aspx

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рдЪрд░реНрдЪрд╛ рдорд┐рд▓реА, рдЬрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╡рд╣ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рджрд▓реАрд▓

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ

 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> рдХреЛ рдЕрдиреНрдп Dictionary KeyCollection рдЬреИрд╕реЗ SortedDictionary рдпрд╛ ImmutableDictionary ?

рдЕрдкрдбреЗрдЯ

  • рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ TryGetValue рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореЗрдВ рдирд╣реАрдВ рд╣реИ ISet<T> рдФрд░ рдЬреИрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрднреА рд░рд┐рдмреЗрд╕рд┐рдВрдЧ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ ISet<T> рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IReadOnlySet<T> ред
  • рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ ReadOnlySet<T> рд╡рд░реНрдЧ рдЬреЛ ReadOnlyCollection<T> ред
api-approved area-System.Collections up-for-grabs

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди:

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 рдХреМрди рд╕реА рднрд╛рд╖рд╛? рд╕реАрдПрд▓рдЖрд░ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рджрд░реНрдЬрдиреЛрдВ рд╣реИрдВред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдХрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рдХреЛрдИред рдПрдХ рдирдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрд▓рдЖрд░ рдХреЛ рдпрд╣ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдордирдорд╛рдирд╛ рд╡рд░реНрдЧ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ (рдФрд░ рд╕реАрдПрд▓рдЖрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдХреЛрдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд░рдгреА)ред

@whoisj рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕реА # рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрдгрдп рд╕рднреА рд╕рдВрдЧреНрд░рд╣реЛрдВ рдореЗрдВ рд╕рдордорд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рдкрдардиреАрдп рд╕реВрдЪреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрди рдЦреЗрд▓реЛрдВ рдореЗрдВ рдЬреЛ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рджреЛрдиреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:

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

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ immutable T рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Immutable...<T> рд╕рдВрдЧреНрд░рд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред

@HaloFour рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕ рд╕рдбрд╝рдХ рд╕реЗ рдиреАрдЪреЗ рдЙрддрд░ рдЪреБрдХреЗ рд╣реИрдВ: this )"ред

@dsaf рдмрд┐рд▓реНрдХреБрд▓! рдПрдХ рдЕрдиреНрдп рдЕрдВрдХ рдореЗрдВ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдбреЛрдирд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдПрдВрдЯреА-рдЯрд░реНрдо рд╣реИред readonly Bag<writable Element> рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫред

рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ & рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рд╕реА рднреА рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕реАрдПрд▓рдЖрд░ рджреНрд╡рд╛рд░рд╛ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рддрд░реНрдХ рдХреЗ рд╕рдВрдХрд▓рди рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдХреА рдорд╛рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рди рдХрд┐ рд░рди-рдЯрд╛рдЗрдо рдЧрд╛рд░рдВрдЯреАред рдЗрд╕рдореЗрдВ рдХреЛрдИ рднреА рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐ рдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

@whoisj рд╢рд╛рдпрдж, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреБрдЫ dsaf рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдЬ рджреЛрдкрд╣рд░ рдХреЛ рд╢рд╛рдЦрд╛/рдкреАрдЖрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреАрдореЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЖрдк рдЗрд╕реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд┐рдВрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдорд╛рди рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдкрд░реЗ) рдФрд░ рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ "рдЕрдиреБрдЪрд┐рдд" рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдореМрдЬреВрджрд╛ рд░рдирдЯрд╛рдЗрдо рддрдВрддреНрд░, initonly рдлрд╝реАрд▓реНрдб, рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реА # рднрд╛рд╖рд╛ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ "рд╢реБрджреНрдз" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рдорд┐рд▓ рд╕рдХреЗред рд╡рд┐рд╢реЗрд╖рддрд╛ PureAttribute рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЫрд┐рдЯрдкреБрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдФрд░ рднрд▓реЗ рд╣реА рд╕реА # рдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реЛ (рд╢реБрджреНрдз рдХреЗрд╡рд▓ рд╢реБрджреНрдз рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐), рдпрд╣ рдПрдХ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд╛рдЬрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╛рд░ рдЖрдИрдПрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рднреА рджрд╛рдВрд╡ рдореВрд▓ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдЭреБрдХ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рдЕрд╕реЗрдВрдмрд▓реА рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИред

@HaloFour рдореЗрд▓рд╛ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╢реБрджреНрдз" рдпрд╛ "рдХреЙрдиреНрд╕реНрдЯ" рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдЕрднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░реА рдХреЙрдордиреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (Commons.Collections https://github.com/yanggujun/commonsfornet/tree/master/src/Commons.Collections/Set ) рдореЗрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╕рдорд░реНрдерди рд╣реИред рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреГрдкрдпрд╛ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреБрдЫ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦреЗрдВред

@yanggujun рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реЛрд▓ рдХрд░реВрдВрдЧрд╛ред

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреБрдЫ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦреЗрдВред

рдпрд╣ рдПрдХ рдХрд╛рдордХрд╛рдЬ рд╣реИ, IReadOnlySet рдЬреИрд╕реЗ рдореМрд▓рд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЗрд╕реЗ "рдПрдкреАрдЖрдИ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░" рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреЗрдХрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдФрд░ рдЬрдм рд╣рдо рдЗрд╕рдореЗрдВ рд╣реЛрдВ, рддреЛ рдЗрд╕реЗ "рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП" рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдирд╛рдо рджреЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рджрд┐рд▓рдЪрд╕реНрдк рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ: http://stackoverflow.com/questions/15262981/why-does-listt-implement-ireadonlylistt-in-net-4- 5)
"рдкрдардиреАрдп" рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

@GiottoVerducci рдирд╣реАрдВред рдореИрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд рдирд╛рдордХрд░рдг рдкреИрдЯрд░реНрди рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рднрд▓реЗ рд╣реА рд╡рд╣ рдЕрдкреВрд░реНрдг рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди:

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);

рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп IReadOnlyCollection<T> рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ ICollection<T> рдореЗрдВ Contains(T item) ?

рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЧреНрд░рд╣ рдкреИрдХреЗрдЬ рдХреЛ рдЕрднреА рднреА рдмреАрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ nuget рд╕реЗ рдЕрд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рдХрд╛рдореЛрдВ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдпрд╣рд╛рдВ рдПрдкреАрдЖрдИ рдкрд░ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЯреИрдЧ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ? рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдЕрдЧрд░ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ рдФрд░ рдХреЛрдИ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдПрдкреАрдЖрдИ @ashmind рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ ISet<T> рдХреЛ IReadOnlySet<T> рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖ IList<T> / IReadOnlyList<T> ?

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрди IReadOnlySet<T> рдХреЛ рд╕рднреА ISet<T> рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ HashSet<T> , SortedSet<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> , рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ рдмреАрд╕реАрдПрд▓ рдХреЗ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╣рд░ рдХрд┐рд╕реА рдХреЛ

@binki

рдореИрдВ рдЕрд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рд╡рд╣ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИ рдЬреЛ рдкрдврд╝рдиреЗ-_рдХреЗрд╡рд▓_ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкрдврд╝рдиреЗ-_рд▓рд┐рдЦрдиреЗ_ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдирд╛рдордХрд░рдг рдЧрд▓рдд рд╣реИ рдФрд░ рд░рдЪрдирд╛ рдЧрд▓рдд рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВред рдореБрдЭреЗ рджреЛрдиреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЯреЗрдмрд▓ рдкрд░ рд╣реИред

@ рд╣реЗрд▓реЛрдлреЛрд░

рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ _view_ рд╣реЛрддрд╛ рд╣реИред рджреГрд╢реНрдп рд╕реНрд╡рдпрдВ _is_ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдкрдиреЗ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЕрдкрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдпрд╣ рд╕рднреА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдХрд┐рд╕реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪ рдХреА рддрд░рд╣ рдЬрд╣рд╛рдВ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдореЗрдВ рдкрдврд╝рдиреЗ-рд▓рд┐рдЦрдиреЗ рдХрд╛ рджреГрд╢реНрдп рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЖрдкрдХреЗ рдиреАрдЪреЗ рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╢рдмреНрдж рдХреНрдпреЛрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП _not_ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдПрдХ рд╕рдВрдкреВрд░реНрдг рдирдЧреЗрдЯ рдкреИрдХреЗрдЬ/рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рд╣реИ (рдЬрд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛/рдирд┐рдХрд╛рд▓рдирд╛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрднреА рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ-рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ) рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред .NET рдореЗрдВ "рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП" рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдордЬреЛрд░ рдЧрд╛рд░рдВрдЯреА рд╣реИред рдПрдХ рдУрд╡рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛрдиреЗ рд▓рд╛рдпрдХ рд╣реИред

рддреЛ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ IReadOnlySomething<T> рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рдПрдЧреА, рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЦреБрдж рдХреЛ рддрдм рддрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рди рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕реА ++ рдореЗрдВ, const_cast const рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЛ рднреА рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ (рдЖрдЬрдХрд▓ mutable рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде) рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ const рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@binki рдПрдХ рдЕрдЪреНрдЫрд╛ рднреЗрдж рдХрд░рддрд╛ рд╣реИред _рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп_ рдирд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдХреА рдПрдХ рдХрдард┐рди рдЧрд╛рд░рдВрдЯреА рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ IList<T> IReadOnlyList<T> рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

@binki

рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рджреГрд╢реНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИред рд╡рд╣ рдЕрдиреБрдмрдВрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдЕрдиреБрдмрдВрдз рдЙрд▓реНрд▓рдВрдШрди рдорд╛рдиреВрдВрдЧрд╛ред рд╡рд╣ List<T> рд╡рд░реНрдЧ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рдпрд╣ "is-a" IReadOnlyList<T> , рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдореЗрдВ рдЙрд╕ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред

рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдХрдИ рд╕реНрдХреВрд▓ рд╣реИрдВред рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд╕ рд╕реНрдХреВрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реВрдВ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд░рд╛рд╕рдд рдЕрдзрд┐рдХ рд╕рдЦреНрддреА рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ "рдПрдХ-рдПрдХ" рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ List<T> рдФрд░ рдЙрд╕рдХреЗ рдкрд░рд┐рдЬрдиреЛрдВ рдХреЛ рд╢рд╛рдпрдж рдХреБрдЫ 3-4 рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ (рдкрдврд╝реЗрдВ, рд▓рд┐рдЦреЗрдВ, рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ, рдЖрджрд┐) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд╛рдо рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ _can_ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдпрд╣ рдХреНрдпрд╛ _can't_ рдХрд░рддрд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдХреНрд╖рдорддрд╛ рдХреЗ рджрд╛рд╡реЗ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред

@drewnoakes

рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛрдиреЗ рд▓рд╛рдпрдХ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рд╣рдо рдЬрд╣рд╛рдВ рд╣реИрдВ рд╡рд╣реАрдВ рд╣реИрдВред рдпрджрд┐ IList<T> рдХреЛ IReadOnlyList<T> рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдерд╛ рддреЛ ISet<T> рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IReadOnlySet<T> рдЖрджрд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдХреНрдпрд╛ IReadableX<T> , IWritableX<T> , рдЖрджрд┐ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП IReadOnlyX<T> рд╕рд╛рде рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдзрдХреНрдХрд╛ рджреЗрдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ?

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрдд рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ IList<T> IReadOnlyList<T> рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдкреБрд░рд╛рдиреЗ .net рдврд╛рдВрдЪреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдВрдХрд▓рд┐рдд рдЕрд╕реЗрдВрдмрд▓реА рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рдПрдмреАрдЖрдИ-рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ, рдЬрдм рд╕реНрд░реЛрдд рдХреЛрдб рдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдкрдиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ IList<T> рдХрд░рдиреЗ рд╡рд╛рд▓реЗ BCL рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ IList<T> IReadOnlyList<T> , рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ IReadOnlyList<T> рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ: http://stackoverflow.com/a/35940240/429091

@HaloFour рдЪреВрдВрдХрд┐ List<> рдФрд░ HashSet<> ICollection<> рдФрд░ IReadOnlyCollection<> , рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ IReadOnly рдкрд╣реБрдВрдЪ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ рдХреНрд╖рдорддрд╛ред рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, IAnything рд╡рд┐рд╕реНрддрд╛рд░ IReadOnlyAnything рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ IReadable IReadOnly рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рд╣рд░ рдХреЛрдИ IReadOnly рд╕реЗ _mean_ IReadable рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдЗрд╕реЗ рдХрд╛рдпрдо рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

рд╣рдо рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЗрддрдиреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП IReadOnly рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ, рдЬреИрд╕реЗ рд╣рдо рдареЛрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред

@ashmind рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ рдХрд┐ рдХреЛрдИ рднреА CaseInsensitiveStringCollection рдпрд╛ рдХрд┐рд╕реА рдРрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддреБрд▓рдирд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реЛред

(рдПрдХ рдЕрдЬреАрдм рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ Contains(T, IEqualityComparer<T>) рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдмрд╛рд░ рдХреА рдХрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рд╣реЛрдЧреАред рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ Contains(T, IEqualityComparer<T>) рдЖрдо рд╣реИ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред)

@jnm2

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рддрд░реАрдХрд╛ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред

рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдХреЛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдпрд╛ рдбрд┐рдХреНрд╢рдирд░реА рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рдирддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ - рдПрдХ рд╣реА рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рд╛рдордиреЗ рд▓рд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╕реБрдЭрд╛рд╡ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рдФрд░ рдпрд╣ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдУрдкреА рдиреЗ рдХрд╣рд╛, рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдЬрдм IReadOnlyList рдХреЛ IReadOnlySet рдХреЗ рдмрд┐рдирд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдФрд░ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ IReadOnlySet рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ (рдореЗрд░реА рдЕрдкрдиреА рдЯреАрдо рдХрд╛ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ)ред рд╡реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрд░рдПрдлрдПрдХреНрд╕ рдХрдХреНрд╖рд╛рдПрдВ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдврд╛рдВрдЪреЗ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИ: рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИрд╢рд╕реЗрдЯ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдкреА рдпрд╛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ IReadOnlySet рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрдо рд╕реЗ рдХрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдХреНрд╕рд░ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрддрд╛ рд╣реИред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд╛рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ IReadOnlySet рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрдЧрддрд┐ IReadOnlyXXX рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЪрд┐рдВрддрд╛ рдХреЛ рджреВрд░ рдХрд░рддреА рд╣реИред рд╡рд╣ рдЬрд╣рд╛рдЬ рд░рд╡рд╛рдирд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдореМрдЬреВрджрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА (IReadOnlyCollection) рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред .NET рдХреЗ рд▓рд┐рдП рдмреИрдХ-рдХреЙрдореНрдкреИрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдЙрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ IReadOnlyXXX рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рддреБрд▓рдирд╛рдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рднреА рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдЬрд╣рд╛рдЬ рд░рд╡рд╛рдирд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдПрдХрдорд╛рддреНрд░ рдкреНрд░рд╢реНрди рдЬреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЗрди рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╣реИред

рдкрд╣рд▓реЗ @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 рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

@ рд╣рд╛рд░реВрди-рдореЗрдпрд░реНрд╕ рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ IsSubsetOf рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ _рдХреБрд╢рд▓_ рддрд░реАрдХреЗ рд╕реЗ Contains рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдпрд╣ рджреЛ рд╣реИрд╢ рдЯреЗрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Contains рдкрд░ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣реИрд╢ рдорд┐рд▓рд╛рди рдХреЗ рдмрдЬрд╛рдп рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, IComparableSet<T> рдореЗрдВ рд╕реЗрдЯ рдСрдкрд░реЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреБрдЫ рд╕реЗрдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА IEnumerable<T> рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред

@ jnm2 рд╣реИрд╢рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдФрд░ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЬреЛ IReadOnlySet IReadOnlyCollection рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рд╕реЗрдЯ рдПрдХ рд╣реА рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж IReadOnlySet рдореЗрдВ рддреБрд▓рдирд┐рддреНрд░ рдЧреБрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ IReadOnlyDictionary KeyComparer рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ IReadOnlySet рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рди рд╣реЛред рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ IReadOnlyDictionary рдкрд░ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдВрд╢реЛрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реЛрдЧрд╛:

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реЗрдЯ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдХреБрд╢рд▓ рдорд╛рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдпрджрд┐ рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рд╣реИрдВред IReadOnlyDictionary рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╢рд╛рдпрдж рд╡реЗ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред ISetComparable рдЬреИрд╕рд╛ рдХреБрдЫред рдпрд╛ @drewnoakes рд╕реЗ рдЖрд░реЗрдЦрдг рдПрдХ IComparableSet рд╣реЛ рд╕рдХрддрд╛ рд╣реИрд▓реЗрдХрд┐рди рд╕реЗрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рд╕рд┐рд░реНрдл рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ IReadOnlySet рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:

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://github.com/dmitriyse/ClrCoder/issues
рдпрджрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рд╢рд╛рдпрдж рдХреБрдЫ рджреМрд░ рдХреЗ рд╢реЛрдзрди рдХреЗ рдмрд╛рдж) рддреЛ рд╣рдо CoreFX рдЯреАрдо рдХреЛ рдЗрд╕ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

@terrajobst рдХреНрдпрд╛ рдореМрдЬреВрджрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдареАрдХ рд╣реИ?

@safern List<T> рдореЗрдВ IReadOnly рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рддреЛ рдХреНрдпрд╛ рдЗрд╕реЗ рдЕрдЧрд▓реЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ?

рдпрд╣ рдХрд╛рдо рдХрдм рдзрд░рд╛рддрд▓ рдкрд░ рдЖ рд░рд╣рд╛ рд╣реИ? рдХреЛрдИ рд╕рдордпрд╕реАрдорд╛?

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> : рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдРрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рддрддреНрд╡ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддреЗ рд╣реИрдВред рд╣реИрд╢рд╕реЗрдЯрдФрд░ рдХреНрд░рдордмрджреНрдзрд╕реЗрдЯрд╕рдВрдЧреНрд░рд╣ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдХреЛрдб рд╕реЗ

ISet<T> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реА bool Contains<T>(T item); рдкрджреНрдзрддрд┐ ICollection<T> рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдЗрд╕рдореЗрдВ int Count { get; } рд╡рд╛рдпрд╛ ICollection<T> ред

рддреЛ рд╣реЛрдЧрд╛:

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

рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡, рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдХрдо, рдмрдбрд╝рд╛ рд▓рд╛рднред

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╣реЛрдиреЗ рджреЗрдВред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдФрд░ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЗрд╕реЗ рддрдм рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВред

@karelz @terrajobst @safern @ianhays

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣ рдЪрд░реНрдЪрд╛ рдорд┐рд▓реА, рдЬрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╡рд╣ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред

рджрд▓реАрд▓

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ

 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> рдХреЛ рдЕрдиреНрдп Dictionary KeyCollection рдЬреИрд╕реЗ SortedDictionary рдпрд╛ ImmutableDictionary ?

рдЕрдкрдбреЗрдЯ

  • рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ TryGetValue рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореЗрдВ рдирд╣реАрдВ рд╣реИ ISet<T> рдФрд░ рдЬреИрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХрднреА рд░рд┐рдмреЗрд╕рд┐рдВрдЧ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ ISet<T> рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IReadOnlySet<T> ред
  • рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ ReadOnlySet<T> рд╡рд░реНрдЧ рдЬреЛ ReadOnlyCollection<T> ред

@TylerBrinkley рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░ рд╕рдХреВрдВ рдФрд░ рдПрдкреАрдЖрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рджреВрдВ?

@TylerBrinkley IReadOnlySet рдореЗрдВ EqualityComparer рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВрдЗрдВрдЯрд░рдлреЗрд╕ред рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрд░рдПрдлрдПрдХреНрд╕ рдореЗрдВ рдбрд┐рдХреНрд╢рдирд░реА рдФрд░ рд╕реЗрдЯ рдореЗрдВ рдЫреВрдЯ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдореБрджреНрджрд╛ рд╣реИред

@dmitriyse рдХреЗрд╡рд▓ IEqualityComparer<T> рд╕рдВрдкрддреНрддрд┐ рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрдЧрд╛? рдЖрдк рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ?

рд╕рд╣реА рд╕рдВрдЧреНрд░рд╣ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдФрд░ рд╕реЗрдЯреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛рдХрд░реНрддрд╛рдУрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред

рдпрджрд┐ рдЖрдк рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ? рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ IEqualityComparer<T> рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдиреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рд╣реА EqualityComparer рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рд╣реИрд╢рд╕реЗрдЯ рдмрдирд╛рдиреЗ рдкрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реЗрдЯ рдореЗрдВ EqualityComparer рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рд┐рд░реНрдл рдХреНрд▓реЛрдирд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рджреЛ рд╕реЗрдЯреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рд╣реА рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрдВрдЯреЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрд╖реНрдЯрддрдо рддреБрд▓рдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╢рд╛рдорд┐рд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде IReadOnlySet рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реЗрдЯ рддреБрд▓рдирд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рдЬрд┐рддрдирд╛ рдХрд┐ рдХрд┐рд╕реА рд╕реЗрдЯ рдХреЗ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрд▓реБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ https://aka.ms/o0ukef


рд╕реЗ: рдЯрд╛рдпрд▓рд░ рдмреНрд░рд┐рдВрдХрд▓реЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рднреЗрдЬрд╛ рдЧрдпрд╛: рдЧреБрд░реБрд╡рд╛рд░, 10 рдордИ, 2018 6:21:52 рдкреВрд░реНрд╡рд╛рд╣реНрди
рдкреНрд░рддрд┐: рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕
рд╕реАрд╕реА: рд╣рд╛рд░реВрди рдореЗрдпрд░реНрд╕; рдЙрд▓реНрд▓реЗрдЦ
рд╡рд┐рд╖рдп: рдкреБрди: [рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕] рдХреГрдкрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IReadOnlySet рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣реИрд╢рд╕реЗрдЯ рдмрдирд╛рдПрдВ, рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (#1973)

рдпрджрд┐ рдЖрдк рдХреНрд▓реЛрдирд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ? рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ IEqualityComparer рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА.

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ % 7C01% 7C% 7Cc45ea16cd3034ddd69d808d5b678ff33% 7C84df9e7fe9f640afb435aaaaaaaaaaaa% 7C1% 7C0% 7C636615553141417289 рдФрд░ sdata = xRI27JtyaAwnZ2anY05oTlxmPY5AaGVl% 2BRdXK2uR0% 2F8% 3 рдбреА рдФрд░ = 0 рд╕реБрд░рдХреНрд╖рд┐рдд , рдпрд╛ рдзрд╛рдЧреЗ рдореВрдХ https://eur01.safelinks.protection.outlook.com/?url=https%3A% 2F% 2Fgithub.com% 2Fnotifications% 2Funsubscribe рд▓реЗрдЦрди% 2FAMuQLmqboBWyHweWHSUoE1YM2OrfHZZxks5txD7wgaJpZM4E9KK- рдФрд░ рдбреЗрдЯрд╛ = 02% 7C01% 7C% 7Cc45ea16cd3034ddd69d808d5b678ff33% 7C84df9e7fe9f640afb435aaaaaaaaaaaa% 7C1% 7C0% 7C636615553141417289 рдФрд░ sdata = hLtAXEyFNVEgWike6tMwAfUVC% 2BucyjXUDwoLOLDV5gk% 3 рдбреА рдФрд░ = 0 рдЖрд░рдХреНрд╖рд┐рдд ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВтАФрдЖрдк рдпрд╣ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрдЯ рдореЗрдВ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЗрд╕ рд╕реЗрдВрд╕рд┐рдЯрд┐рд╡, рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓, рдЖрджрд┐) рдХреЗрд╡рд▓ рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрди рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ Dictionary<TKey, TValue>.KeyCollection рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдХреЛрдб рдЖрдХрд╛рд░ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдЧрдд рдЖрдПрдЧреАред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рддрддреНрдХрд╛рд▓ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирдпрд╛ рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдпрд╣ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк IReadOnlySet рдкрд░ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

SortedSet рдПрдХ IComparer SortedSet рд▓реЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ HashSet рдПрдХ IEqualityComparer рд▓реЗрддрд╛ рд╣реИред

рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ, рддреБрд▓рдирд╛рдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред

рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрд▓реБрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ https://aka.ms/o0ukef


рд╕реЗ: рдХреЛрд░реА рдиреЗрд▓реНрд╕рди рд╕реВрдЪрдирд╛рдПрдВ @github.com
рднреЗрдЬрд╛ рдЧрдпрд╛: рдЧреБрд░реБрд╡рд╛рд░, рдордИ 10, 2018 5:04:06 рдЕрдкрд░рд╛рд╣реНрди
рдкреНрд░рддрд┐: рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕
рд╕реАрд╕реА: рд╣рд╛рд░реВрди рдореЗрдпрд░реНрд╕; рдЙрд▓реНрд▓реЗрдЦ
рд╡рд┐рд╖рдп: рдкреБрди: [рдбреЙрдЯрдиреЗрдЯ/рдХреЛрд░рдПрдлрдПрдХреНрд╕] рдХреГрдкрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IReadOnlySet рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╣реИрд╢рд╕реЗрдЯ рдмрдирд╛рдПрдВ, рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (#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% 3 рдбреА рдФрд░ = 0 рд╕реБрд░рдХреНрд╖рд┐рдд , рдпрд╛ рдзрд╛рдЧреЗ рдореВрдХ https://eur02.safelinks.protection.outlook.com/?url=https%3A% 2F% 2Fgithub.com% 2Fnotifications% 2Funsubscribe рд▓реЗрдЦрди% 2FAMuQLu5JGLcqrpMyGWLygbCsaSQSXFgNks5txNV2gaJpZM4E9KK- рдФрд░ рдбреЗрдЯрд╛ = 02% 7C01% 7C% 7C0ef6d84125be4c450fdc08d5b6d2b70a% 7C84df9e7fe9f640afb435aaaaaaaaaaaa% 7C1% 7C0% 7C636615938478979295 рдФрд░ sdata = 9pnuMULuDu9HWb7un% 2FWYq6iYdjTKFsjN7nKiToaeHkk% 3 рдбреА рдФрд░ = 0 рдЖрд░рдХреНрд╖рд┐рдд ред

IUnorderedSet рдФрд░ IOrderedSet рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ IReadOnlySet рдорд╛рдзреНрдпрдо рд╕реЗ рдзрдХреНрдХрд╛ рджреЗред

рдореБрдЭреЗ @pgolebiowski рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИ рд▓реЗрдХрд┐рди рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдФрд░ рднреА рдмреБрдирд┐рдпрд╛рджреА рдмрдирд╛ рджреЗрдЧрд╛ред

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

рдпрд╣ рддрдм рдЕрдВрддрд░рд╛рд▓ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ) рдЬреИрд╕реЗ рдмреЗрд╢реБрдорд╛рд░ рд╕реЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЙрд╕ рдФрд░ IReadOnlySet рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреИрд╕реЗ ICountableSet (рдЙрд░реНрдл IEnumerableSet ), IUnorderedSet рдФрд░ IOrderedSet рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ IReadOnlySet рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЙрд╕ рдкрд░ рдПрдХ рдмрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

@NickRedwood . рдХреЗ рд▓рд┐рдП +1

рдпрд╣ рдЕрдм 3 рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рдЦреБрд▓рд╛ рд╣реИред рдХреГрдкрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓рдХрд░ рдРрд╕рд╛ рдХрд░реЗрдВред @NickRedwood рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд░рд┐рдЪрдп рдЕрдиреНрдп рд╕рднреА рд╕рдВрд╡рд░реНрджреНрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

@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> ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдзрд┐рдХ рдмреБрдирд┐рдпрд╛рджреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЧрд▓рддреА рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХ рдерд╛ рддреЛ рдпрд╣ Contains рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХрд▓-рд╡рд┐рдзрд┐-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЧрдгрд┐рддреАрдп рдЖрдзрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдл рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рдореМрдЬреВрджрд╛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрдо рд░реЗрдЯреНрд░реЛрдлрд┐рдЯрд┐рдВрдЧ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ рддреЛ IReadOnlySet<T> рдЖрдзрд╛рд░ рдкрд░ IReadOnlyCollection<T> рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

IReadOnlyCollection<> рдореЗрдВ .Contains рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред

рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЛ contravariant рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХрд┐рдпрд╛ рд╣реИред IReadOnlySet<T> рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрдм рддрдХ рдХрд┐ рдереНрд░реЗрдб рдореЗрдВ рдЬрд▓реНрджреА рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВред

@TylerBrinkley рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ IsReadOnly рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд░рди-рдЯрд╛рдЗрдо рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк IReadOnlyCollection<T> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рдереЗ рддреЛ рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд░ рдпрд╛ рдХреИрд▓реА рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рдВрднрд╛рд╡рд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп рд▓реБрдХрдЕрдк рддреЗрдЬрд╝ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ "рд╕реЗрдЯ" рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред

рдХреЗрд╡рд▓ Contains рд╡рд┐рдзрд┐ рд╣реЛрдиреЗ рд╕реЗ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ Set рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдПрдХ Collection рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Contains ISet рдХрд╛ рд╕рджрд╕реНрдп рднреА рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ ICollection рдЬреЛ ISet рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред ISet рдЕрдиреНрдп рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ Set рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд╢рд╛рдпрдж рдЗрд╕рдХреА Contains рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред

@TylerBrinkley рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ IReadOnlyCollection<T>.Contains(T) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ? рдореИрдВрдиреЗ рдорд╛рдирд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк IReadOnlySet<T> рдкреЗрд╢ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЬрдм рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрд╕ рдкрд░ IReadOnlySet<T>.Contains(T) рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@ рдЬреЗрдПрдирдПрдо 2 рдХрд╣рддреЗ рд╣реИрдВ:

IReadOnlyCollection<> рдореЗрдВ .Contains рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕реЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрднреА рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИред IReadOnlySet<T> рдХрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реЛрдирд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдЬрдм IReadOnlyCollection<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 рдореИрдВ рд╡рд╣рд╛рдБ рдПрдХ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд Contains рдкрд░ рд╡рд┐рдзрд┐ IReadOnlySet<T> рдХреЗ рдмрд╛рдж рд╕реЗ IReadOnlyCollection<T> рдПрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдлрд┐рд░ рднреА рдореИрдВ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рдЧреИрд░-рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ ISet<T> рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Dictionary.KeyCollection рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рди рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ?

рдареАрдХ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИ:

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

рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рд░ рдХреЛрдИ рд╕рд╣рдордд рд╣реЛрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдЕрдм рд╣рдо рдпрд╣рд╛рдБ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдХрд░реЗрдВред рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдб рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ, рдХрд┐рд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ?

рдореБрдЭреЗ @ashmind рдХрд╛ рд╕реБрдЭрд╛рд╡ рдкрд╕рдВрдж рд╣реИ ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ Dictionary.Keys рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ IReadOnlySet<TKey> ред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕реЗ api-ready-for-review рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдЕрднреА рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдлрд┐рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдирд╣реАрдВ рд╣реИред

рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ] рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ - рдореЗрд░рд╛ рдореВрд▓ рдЙрддреНрддрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ рд╣реБрдЖ рдерд╛ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдХреЛрдИ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИ, рдкрд╛рда рд╕рдВрдкрд╛рджрд┐рддред рдЧрдбрд╝рдмрдбрд╝реА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛!

рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?

рдПрдкреАрдЖрдИ рдкрд░ рдЕрднреА рддрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЧрдпрд╛ - @safernред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реВрдЪреА рдореЗрдВ рдХрд┐рддрдирд╛ рдКрдВрдЪрд╛ рд╣реИред рдЕрдкрд╡реЛрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдлреА рдЬреНрдпрд╛рджрд╛ рд╣реИред
рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо .NET Core 3.0 рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдбрд╛рдЙрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 3.0 рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рд▓реАрдХ рд╕реЗ рд╣рдЯрдХрд░ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдХрд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХреЛрдб рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬреЛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдкреИрд░рд╛рдореАрдЯрд░/рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдпрд╛ рддреЛ IEnumerable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрдо рдХреБрд╢рд▓ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕/рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рд╣реИ рдЬреЛ Contains рд▓реБрдХрдЕрдк рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрд╢рд▓ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░/рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ IEnumerable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ ReadOnlyDictionary.Keys рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВред рдЪреВрдВрдХрд┐ Enumerable.Contains рд▓рд┐рдВрдХ рдореЗрдВ Contains рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдкрд░ рдХреБрд╢рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЙрд╕ рдЗрд░рд╛рджреЗ рдХреЛ рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдХрдо рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ adamt06 рдЖрдк ISet<T> рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВред

@scalablecory рдЖрдк рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕рд╣реА рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реИ: ImmutableHashSet<T>

рдХреНрдпрд╛ рдХреЛрдИ рдЬрд╛рдирддрд╛/рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ ICollectionIReadOnlyCollection рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ??
рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореЗрд░реЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рдЦреЛрд▓рдирд╛ред рд╢рд╛рдпрдж рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╖рдп рд╕реЗ рджреВрд░, рдФрд░ 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>
рдПрдХ рдкрдарди/рд▓реЗрдЦрди рд╕рдВрдЧреНрд░рд╣ рднреА рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

@ рдЬреЗрдиреЗрд░рд┐рдХ0

рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ ICollection рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

ICollection<out T> : IReadOnlyCollection<out T>

рдПрдХ рдкрдарди/рд▓реЗрдЦрди рд╕рдВрдЧреНрд░рд╣ рднреА рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ICollection<out T> рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ICollection<T> рдореЗрдВ рдПрдХ рд╕рджрд╕реНрдп .Add(T item) ред

рджреВрд╕рд░рд╛, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 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 рд╣реИ: https://stackoverflow.com/a/14944400 ред

@binki " "рдЖрдИрд╕реАрдУрд▓реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛, рдореЗрд░реЗ рдЯрд╛рдЗрдкреЛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж ..
рдбреЙрдЯрдиреЗрдЯрд╕реНрдЯреИрдВрдбрд░реНрдб рдФрд░ рдиреЗрдЯ461. рдФрд░ рдпрд╣реАрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдиреЗрдЯрд╕реНрдЯреИрдВрдбрд░реНрдб 2+

рдореИрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ ...
рдПрдХ рдкрдарди/рд▓реЗрдЦрди рд╕рдВрдЧреНрд░рд╣ рднреА рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдФрд░ рдХрд┐рд╕реА рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "ToArray ()" рдмрд╕ рдХрдо рдмреЗрдирдХрд╛рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?

рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЙрдЪреНрдЪ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред ICollection рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА IReadOnlyCollection рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рд╛рдЧреВ рд╣реИрдВред рдиреЛрдЯрд┐рдВрдЧ рдЯреВрдЯрдиреА рдЪрд╛рд╣рд┐рдП...:-/

@ Generik0 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рд╕рдВрдЧрддрддрд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝реЗрдЧрд╛ рдЬреЛ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ [рд╕реЛрдЪ рдирд╣реАрдВ рд░рд╣реЗ рдереЗ; рдпрд╣ рд╣реЛрдЧрд╛], рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рдЗрдирд░реА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ рдЬреЛ рдЖрдИрдПрд▓ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕реА # рдирд╣реАрдВред

рдареАрдХ рд╣реИ @ jnm2 рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВ рдЕрдкрдиреЗ рдСрдл рдЯреЙрдкрд┐рдХ рд╢реЗрдЦрд╝реА рдХреЛ рдЕрдм рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛, рдЬрд░рд╛ рд╕реЛрдЪрд┐рдП рдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИред рд╕реБрдирдиреЗ/рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж :-)

@jnm2

@ Generik0 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд░реЛрдд рд╕рдВрдЧрддрддрд╛ рдХреЛ рдирд╣реАрдВ

рдирд╛рдЗрдЯрдкрд┐рдХ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ) рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХрд╛ рд╕реНрд░реЛрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ICollection<T> рдХреЛ .net-4.5 рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕реНрд░реЛрдд рд╕рдВрдЧрддрддрд╛ рдХреЛ рднреА рддреЛрдбрд╝ рджреЗрдЧрд╛ред IReadOnlyCollection<T>.Count рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрдЧ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрдЧрддрддрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╕реМрджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ .net рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛ (рдЖрдкрдХреЛ тЙе.net-4.5 рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рд░рдЦрдиреЗ рд╣реЛрдВрдЧреЗ <.net-2 рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдЖрдк рдкреБрд░рд╛рдиреЗ рдврд╛рдВрдЪреЗ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рджреЛрдиреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ)ред

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕реА # 8 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдорд░реНрдерди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдпрджрд┐ ICollection<T> .NET рдХреЛрд░ 3.0+ рдХреЗ рд▓рд┐рдП IReadOnlyCollection<T> рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣реА рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдпрд╛рдиреА рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

[ @ 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"); } }

@ Generik0 рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп enumerable as IReadOnlyCollection<T> ?? throw ... рдпрд╛ (IReadOnlyCollection<T>)enumerable рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?

@ рдЬреЗрдПрдирдПрдо 2 рдУрдо ред рддреБрдо рд╕рд╣реА рд╣реЛред рдХрднреА-рдХрднреА рдЖрдк рд╕реНрдкрд╖реНрдЯ рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдЙрд▓рдЭрд╛ рджреЗрддреЗ рд╣реИрдВ !!!

рдореИрдВ рдЕрднреА рднреА рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛, рдмрд╕ рд╕рд╛рджрдЧреА рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП ;-)
рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрдд....

рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдорд╛рдирдХ lib рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╣реИрд╢рд╕реЗрдЯ <> рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдХрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ (рдЙрдореНрдореАрдж рд╣реИ) рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣рдорд╛рд░реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╢рд░реНрдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ рдЖрдк рд╕реЗрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдореВрд╣ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдореМрдЬреВрджрд╛ рд╕реЗрдЯ рдЬреИрд╕реЗ HashSet<T> рдЙрдирдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдм рдЙрднрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдЯ (рдЗрдВрдЯреЗрдВрд╢рдирд▓ (рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА) рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рд╕реВрдЪреАрдмрджреНрдз), рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП, рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд, рдЧрдгрдиреАрдп, рдЕрдирдЧрд┐рдирдд рдЕрдирдВрдд, рдмреЗрд╢реБрдорд╛рд░ рдЕрдирдВрдд, рд╕рдВрднрд╡рддрдГ рдЧрдгрд┐рддреАрдп рдбреЛрдореЗрди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред , рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЖрджрд┐) рд╡рд┐рднрд┐рдиреНрди рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрди рд╕реЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рднреА рд╕рдВрдШ, рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди, рдХрд╛рд░реНрдбрд┐рдиреИрд▓рд┐рдЯреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред

рдпрд╣ рдореБрдЭреЗ рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ 5 рд╕рд╛рд▓ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдЬрд┐рд╕реЗ рдПрдХ рджрд┐рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ резрежрежрежx рдмрдбрд╝реА рдЧреИрд░-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдЬреЛ рд╢рд╛рдпрдж рдирд╣реАрдВ рднреА рд╣реЛ?

рдпрд╣ рдореБрдЭреЗ рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ 5 рд╕рд╛рд▓ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдЬрд┐рд╕реЗ рдПрдХ рджрд┐рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ резрежрежрежx рдмрдбрд╝реА рдЧреИрд░-рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдЬреЛ рд╢рд╛рдпрдж рдирд╣реАрдВ рднреА рд╣реЛ?

рдореИрдВ рд╕рд┐рд░реНрдл 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> рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ)ред рд╣рдо рдмрд╛рдж рдХреЗ рдЪрд░рдг рдореЗрдВ ReadOnlySet<T> рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ IReadOnlySet<T> рдХреЗрд╡рд▓ ISet<T> рд╕реЗ рдХрдо рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдПрдкреАрдЖрдИ рд╣реИред
  • рд╣рдореЗрдВ IReadOnlySet<T> рдХреЛ ImmutableSortedSet<T> рдФрд░ ImmutableHashSet<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> рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ)ред

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдЪ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ https://github.com/dotnet/corefx/issues/41409 рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?

@terrajobst

рд╣рдо ISet<T> рд╡рд┐рд╕реНрддрд╛рд░ IReadOnlySet<T> рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рдо рдЕрдиреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ)ред

рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдЪ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ dotnet/corefx#41409 рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рд╣рдордиреЗ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреАред рд╣рдо рд╕реЛрдЪрддреЗ рдереЗ рдХрд┐ рдбреАрдЖрдИрдПрдо рдХрд╛рдо рдХрд░реЗрдЧрд╛ , рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕рдорд╛рдзрд╛рди рдкрд░ рдЪрд▓реЗ рддреЛ рд╣рдордиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╢рд╛рд░реНрдк рдбрд╛рдпрдордВрдб рдореЗрдВ рдкрд░рд┐рдгрдд рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдореИрдЪ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЪреБрдиреМрддреА рджреА рдЧрдИ рдереА рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@terrajobst / @danmosemsft рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ?

рдФрд░, @terrajobst рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
```
рд╣рдореЗрдВ IReadOnlySet рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПрдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдкрд░рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрд╢рд╕реЗрдЯ(рдФрд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рддрд╛)
рд╣рдореЗрдВ рдЖрдИрд╕реЗрдЯ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.
````
рд╕рд╛рде рд╣реА рд╣реИрд╢рд╕реЗрдЯ, рд╕реЙрд░реНрдЯреЗрдбрд╕реЗрдЯ рдкрд░ рдЙрдкрд░реЛрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред

рд╕реНрдХреИрдирд┐рдВрдЧ рдмрд╕ рдХреБрдЫ рднреА рдвреВрдВрдврддреА рд╣реИ рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╕рдВрджрд┐рдЧреНрдз рд▓рдЧрддреА рд╣реИ рддреЛ рдЗрд╕реЗ рд▓рд╛рдПрдВред

рдЕрдЧрд░ рдпрд╣ рдЕрднреА рднреА рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рддреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА

@Jlalond рдирд╣реАрдВ , рдЖрдкрдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@danmosemsft @terrajobst
рдмрд╕ рдПрдХ рдЕрдкрдбреЗрдЯред рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдирд┐рдЬреА рдХреЛрд░ рд▓рд┐рдм рдореЗрдВ рдЬреЛрдбрд╝рд╛, рдмрд╕ рдЗрд╕ рдкрд░ рд╕рдВрдЧреНрд░рд╣.рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд┐рдХ рдЕрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдареЛрдХрд░ рдЦрд╛ рд░рд╣рд╛ рд╣реИред

рдЕрдВрддрд┐рдо рдкреНрд░рд╢реНрди рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд░ рдбреИрди рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЛрдиреЛ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдХреЛрд░рдПрдлрдПрдХреНрд╕ рдХрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЛрдиреЛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рддреЛ рдЕрдЧрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрд╡рддрдВрддреНрд░ рд╢реЛрдз рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИ

@ рдЬрд▓рд╛рд▓реЙрдиреНрдб рдЖрдкрдХреЛ рдореЛрдиреЛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореЛрдиреЛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрд░рд╕реАрдПрд▓рдЖрд░ рдпрд╛ рдореЛрдиреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рдЯреАрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╣рдЬ рдмрдирд╛рдирд╛ рд╣реИред рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
coreclrsrcSystem.Private.CoreLib рдмрдирд╛рдо mononetcoreSystem.Private.CoreLibред (рдЕрдзрд┐рдХрд╛рдВрд╢ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╕рд┐рд╕реНрдЯрдоред рдирд┐рдЬреАред рдХреЛрд░рд▓рд┐рдм)ред рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рдЖрдк рдЙрд╕реЗ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддреЗ - рдЖрдк рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗред

@danmosemsft рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢реАрдШреНрд░ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрд░реЗ @danmosemsft рдмрд╕ рдЗрд╕ рдкрд░ рдлреЙрд▓реЛ рдЕрдк рдХрд░реЗрдВред CoreLib src рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рд╕рдВрджрд░реНрднрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░реЗрдлрд░реА рдЕрд╕реЗрдВрдмрд▓реА рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд░рд╣реА рд╣реИред рдпрд╣ рд╕рдм рдореБрдЭреЗ рдкрдХрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╕рдВрдХреЗрдд рдЬреЛ рдЖрдк рдореБрдЭреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХреВрдВ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, 5 рд╕рд╛рд▓ рдмрд╛рдж)

#32488 . рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Timovzl picture Timovzl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yahorsi picture yahorsi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jamesqo picture jamesqo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

matty-hall picture matty-hall  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

noahfalk picture noahfalk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ