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
์ฝ๊ธฐ ์ ์ฉ ์งํฉ ์์ ์ ์ฌ์ ์ ํค ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ค๋ ์ค์ ๋ฌธ์ ์ ๋ํด ์์ ํ ๋ ์ด ํ ๋ก ์ ์ฐพ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ ๊ฐ ์ ์ํ๋ API๊ฐ ์์ต๋๋ค.
namespace System.Collections.Generic {
+ public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+ bool Contains(T value);
+ bool IsProperSubsetOf(IEnumerable<T> other);
+ bool IsProperSupersetOf(IEnumerable<T> other);
+ bool IsSubsetOf(IEnumerable<T> other);
+ bool IsSupersetOf(IEnumerable<T> other);
+ bool Overlaps(IEnumerable<T> other);
+ bool SetEquals(IEnumerable<T> other);
+ }
- public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
- public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
+ public class ReadOnlySet<T> : ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+ public int Count { get; }
+ public ReadOnlySet(ISet<T> set);
+ public bool Contains(T value);
+ public bool IsProperSubsetOf(IEnumerable<T> other);
+ public bool IsProperSupersetOf(IEnumerable<T> other);
+ public bool IsSubsetOf(IEnumerable<T> other);
+ public bool IsSupersetOf(IEnumerable<T> other);
+ public bool Overlaps(IEnumerable<T> other);
+ public bool SetEquals(IEnumerable<T> other);
+ }
public class Dictionary<TKey, TValue> {
- public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+ public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey>, IReadOnlySet<TKey> {
+ public bool IsProperSubsetOf(IEnumerable<TKey> other);
+ public bool IsProperSupersetOf(IEnumerable<TKey> other);
+ public bool IsSubsetOf(IEnumerable<TKey> other);
+ public bool IsSupersetOf(IEnumerable<TKey> other);
+ public bool Overlaps(IEnumerable<TKey> other);
+ public bool SetEquals(IEnumerable<TKey> other);
}
}
}
Dictionary<TKey, TValue>.KeyCollection
ํ์ฉ๋ฉ๋๊น? ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ IReadOnlySet<T>
๋ SortedDictionary
๋๋ ImmutableDictionary
์ ๊ฐ์ ๋ค๋ฅธ Dictionary
KeyCollection
์์ ๊ตฌํ๋์ด์ผ ํฉ๋๊น?TryGetValue
๊ทธ๋ ์ง์์์๋ก ISet<T>
๊ฐ๋ฅ์ฑ์ด ๊ทธ ์ด๋ ๋ฆฌ๋ฒ ์ด์ค ๋ฐฉ์ง ํ ์์ ๊ฐ์ ISet<T>
๊ตฌํํ๊ธฐ IReadOnlySet<T>
.ReadOnlyCollection<T>
์ ์ ์ฌํ ReadOnlySet<T>
ํด๋์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.๋ถ๋ณํ๊ฒ ๋ง๋๋ ์ธ์ด ๊ตฌ์ฑ์ด ์๋ค๋ฉด ์ข์ง ์์๊น์? ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ง๋ฒ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํ์๊ฐ ์์ ๊ฒ์ ๋๋ค.
@whoisj ์ด๋ค ์ธ์ด์ธ๊ฐ์? CLR์๋ ์์ญ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ ์ฌ์ ์ธ ์ธ์ด ๊ธฐ๋ฅ์ด๋ผ๊ณ ํด๋ ๋ฉํ๋ฐ์ดํฐ ํํ์ด ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ง์ปค ์ธํฐํ์ด์ค(๋๋ ํ๋ ์ธํฐํ์ด์ค)๊ฐ ๊ฐ์ฅ ์ข์ต๋๋ค. ์ ๋ฉํ๋ฐ์ดํฐ ํญ๋ชฉ์ ํตํด ์ปฌ๋ ์ ์ ํ์ ๋ถ๋ณ์ฑ์ ์ ๋ฌํ๋ ค๋ ์๋๋ CLR์ด ์์์ ํด๋์ค๊ฐ ๋ด๋ถ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์์ ๋ํ ๊ฐ์ ์ ํด์๋ ์ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐฐ์ด).
@whoisj ๋๋ ์ด๊ฒ์ด ์ ์ด๋ ๋ฏธ๋์ C# ๋ฒ์ ์ค ํ๋์ ๋ํด ๊ณ ๋ ค
๋ํ ๋ณ๊ฒฝํ ์ ์๋ ์ปฌ๋ ์ ์ ์ด๋ฏธ ์ฌ์ฉํ ์ ์์ต๋๋ค.
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>
๋ผ์ธ์ ๋ฐ๋ผ ๋ญ๊ฐ.
&
๋ก ํ์๋ ์ฐธ์กฐ๋ ์ปดํ์ผ๋ฌ์์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ ์ํ์ต๋๋ค. ๋๋ ์ฌ์ ํ ์ปดํ์ผ ์๊ฐ ํ์ธ์ด ํ์ํ๊ณ ๋ฐํ์ ๋ณด์ฅ์ด ์๋ ๋
ผ๋ฆฌ์ ์ปดํ์ผ ์๊ฐ ํ์ธ์ ์ถ๊ตฌํ๊ธฐ ๋๋ฌธ์ CLR ์์ฒด์์ ๋ฐ๋์ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ธฐ๋ฅผ ์ํ๋ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ ๋ค๋ฃจ์ง๋ง ํธ์ถ ๊ธฐ์ค์
๋๋ค.
@whoisj ์๋ง๋, ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ฝค ์ ์ ์ ์ด๋ฉฐ dsaf๊ฐ ์ค๋ ์คํ์ ๋ถ๊ธฐ/PRํ ์ ์๋ ๊ฒ์์ ์ธ ๊ฐ์ ๋ค๋ฅธ ํ์ ๊ฑธ์ณ ๋ ธ๋ ฅ์ ํฌํจํ๋ ๊ฒ์ผ๋ก ์ด ์์ฒญ์ ๋ฐ๊ฟ๋๋ค.
๋ํ ์ด๊ฒ์ ์ปดํ์ผ๋ฌ ๋ฌธ์ ๋ก ์ทจ๊ธํ๊ณ ์์ต๋๋ค. ์ด ์์ ์์ ๊ด๋ จ ์ปดํ์ผ๋ฌ(JIT ์ปดํ์ผ๋ฌ ์ด์)๋ ์์ผ๋ฉฐ ๊ฒ์ฆ์๋ง์ด "๋ถ์ ์ ํ" ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ถ๋ณ์ฑ์ ๊ธฐ์กด ๋ฐํ์ ๋ฉ์ปค๋์ฆ์ธ initonly
ํ๋๋ ๊ฒ์ฆ์ ๊ฑด๋๋ฐ๋ฉด(๋๋ ๋ฆฌํ๋ ์
์ ํตํด) ์ฝ๊ฒ ๋ฌด๋ ฅํ๋ ์ ์์ต๋๋ค.
C# ์ธ์ด์ ์ปดํ์ผ๋ฌ๊ฐ "์์ํ" ๋ฉ์๋๋ฅผ ๋ ์ ์ง์ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. PureAttribute
์์ฑ
@HaloFour ๋ฐ๋ํ.
"์์" ๋๋ "const" ์ฐธ์กฐ๋ฅผ ์ง์ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ง๊ธ ํ์ํ ๊ฒฝ์ฐ ๋ด Commons ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Commons.Collections https://github.com/yanggujun/commonsfornet/tree/master/src/Commons.Collections/Set )์ ์ฝ๊ธฐ ์ ์ฉ ์ธํธ ์ง์์ด ์์ต๋๋ค. ๊ด๋ฆฌ์๋ ์ด๊ฒ์ด ๊ด๊ณ ๋ผ๊ณ ์๊ฐ๋๋ฉด ์ด ๊ฒ์๋ฌผ์ ์ญ์ ํ์ญ์์ค... ์ ์ ์์ ์คํ ์์ค ๊ตฌํ์ ๋๋ฌ๋ณด๋ ๊ฒ์ ๋๋ค.
@yanggujun ์ข์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ถ๊ฐ ์ข ์์ฑ์ ํผํ๊ธฐ ์ํด ์ง์ ๋กค๋งํ๊ฒ ์ต๋๋ค.
๋ด ์ ์์ ์ผ๋ถ ์คํ ์์ค ๊ตฌํ์ ๋๋ฌ๋ณด๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ฉฐ IReadOnlySet๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ ์ค์ ๋ก .NET Framework ์์ฒด์ ์ผ๋ถ์ฌ์ผ ํฉ๋๋ค.
"api ๊ฒํ ์ค๋น"๊ฐ ๋๋ ค๋ฉด ์คํ๋ ์ด ํ์ํฉ๋๊น?
๊ทธ๋ฆฌ๊ณ "ReadOnly"์ ๋ค๋ฅธ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค(ํฅ๋ฏธ๋ก์ด ๊ฒ์๋ฌผ ์ฐธ์กฐ: http://stackoverflow.com/questions/15262981/why-does-listt-implement-ireadonlylistt-in-net-4- 5)
"๊ฐ๋
์ฑ"์ด ๊ด์ฐฎ์ ๋ณด์
๋๋ค.
@GiottoVerducci ์๋์. ๋ถ์์ ํ๋๋ผ๋ ์ผ๊ด๋ ๋ช ๋ช ํจํด์ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ์ง๋ง ๊ธฐ์กด ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ์ ์์ต๋๋ค.
์ ์๋ API ๋์์ธ:
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsProperSubsetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
}
์ด๊ฒ์ ISet<>
API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค(๋ณ์ด ๋ฐฉ๋ฒ์ ์ ์ธ).
Comparer
๊ฐ ์ด๊ฒ์ ๋ง์ง ์๋ ๊ฒ์ ์ ๊ฐ์ด์ง๋ง ISet<>
๋ IReadOnlyDictionary<>
๋น๊ต์๋ฅผ ๋
ธ์ถํ์ง ์์ผ๋ฏ๋ก ์ง๊ธ ์์ ํ๊ธฐ์๋ ๋๋ฌด ๋ฆ์์ต๋๋ค.
bool Contains(T item);
ICollection<T>
์ Contains(T item)
์์ผ๋ฏ๋ก IReadOnlyCollection<T>
์ ์์ด์ผ ํ์ง ์์ต๋๊น?
๋ถ๋ณ ์ปฌ๋ ์
ํจํค์ง ๋ ์์ง ๋ฒ ํ ๋ฒ์ ์ธ ๋์ nuget์์ ๋์ด๋์ง ์์์ต๋๋ค.
์ด๊ฒ์ ๊ฝค ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ด๋ฉฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ๊ทธ์์ ์ ์ ์๋ฏ์ด ์ฌ๊ธฐ์ API์ ๋ํด ๋ ๋ง์ ์์ ์ด ์์ต๋๊น? ๋์์ด ๋๊ณ ๋๊ตฐ๊ฐ๊ฐ ํ์ํ ๊ฒ์ ์ง์ ํ ์ ์๋ค๋ฉด ์ด์ ๋ํด ์๊ฐ์ ํ ์ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
@ashmind๊ฐ ์ ์ํ API๋
ISet<T>
๋ฅผ IReadOnlySet<T>
๋ก ํ์ฅํ ์ ์์ต๋๊น? IList<T>
/ IReadOnlyList<T>
๋ฐ์ํ์ง ์์์ต๋๊น?
๊ทธ๋ ์ง ์๋ค๋ฉด, ๊ทธ๋ ์ถ๊ฐ ๊ณ ๋ คํด์ผ ํ ๋ค๋ฅธ ๋ณํ๋ฅผ ๊ฐ์ IReadOnlySet<T>
๋ชจ๋ ์ธํฐํ์ด์ค ๋ชฉ๋ก์ ISet<T>
์ ํฌํจํ์ฌ corefx์์ ๊ตฌํ 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>
ํ์ฅํด์๋ ์๋๋ ์ด์ ์ ๋ํด์๋ ๋๋ตํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋น์ ์ด ์์ ์ ๋์น๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ISet<T>
์ธ์๋ IList<T>
, ICollection<T>
, IDictionary<TKey, TValue>
๋ ์ฝ๊ธฐ ์ ์ฉ ๋ณด๊ธฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ์์ ๋์ด์ผ ํ๋ ์ด์ ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ์ฌ๋์ด BCL์ ์ง๊ด์ ์ด์ง ์์ ๋์์ธ์ ํด๊ฒฐํ ๋ ๊ณ์ํด์ ํฉ๋๋ค .
@binki
๋๋ ๋์ํ์ง ์๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ์ข์ํ์ง ์๋ ๊ฒ์ read-_only_ ๋์์ ๊ท์ ํ๋ ๊ณ์ฝ์ด read-_write_ ๋์์ ๊ท์ ํ๋ ๊ณ์ฝ์ ์ํด ํ์ฅ๋๋ ๊ฒ์ ๊ท์ ํ๋ ๊ฒ์ ๋๋ค. ๋ค์ด๋ฐ์ด ํ๋ฆฌ๊ณ ๊ตฌ์ฑ์ด ํ๋ฆฌ๋ค์. ํ์ง๋ง ์ฌ๊ธฐ ์์ต๋๋ค. ๋๋ ๋ ๋ค ๋ณ๊ฒฝํ๊ธฐ ์ํด ํฌํํ๊ณ ์ถ์ง๋ง ๊ทธ๊ฒ์ด ํ ์ด๋ธ์ ์๋์ง ์์ฌ๋ฉ๋๋ค.
@HaloFour
์ด๋ค ๊ฒ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ป์ ๋, ๊ทธ๊ฒ์ ๋ฌด์ธ๊ฐ์ ๋ํ _view_์ ๋๋ค. ๋ณด๊ธฐ ์์ฒด๋ _is_ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค. ์ ํ ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ์บ์คํ ์ ์งํํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ฝ๊ธฐ ์ ์ฉ์ธ ๊ฒ์ ์์ ํ๋ฉด ๋ชจ๋ ์๋์ ๋ชฉ์ ์ ๋ํด ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ด๋ฆฐ ํ์ผ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋๋ ๊ด๋ฆฌ์๊ฐ ๋ฐ์ดํฐ์ ๋ํ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ณด๊ธฐ๋ฅผ ๊ฐ๊ณ ์ฌ์ฉ์ ์๋์์ ๋ณ๊ฒฝํ ์ ์๋ ์น ์ฌ์ดํธ์ ํ์ด์ง์ ๋ํ ์ฝ๊ธฐ ์ ์ฉ ์ก์ธ์ค์ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์์ ์ฝ๊ธฐ ์ ์ฉ์ด ์๋ชป๋ ์ฉ์ด๋ก ๊ฐ์ฃผ๋๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฝ๊ธฐ ์ ์ฉ์ ๋ถ๋ณ์ ์๋ฏธํ์ง _์์ต๋๋ค_. ํ์ํ ๊ฒฝ์ฐ ์ ์ฒด nuget ํจํค์ง/๋ค๋ฅธ API(์ถ๊ฐ/์ ๊ฑฐ๊ฐ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํ์ฌ ์ธ์คํด์ค๊ฐ ์ ๋ ๋ณ๊ฒฝ๋์ง ์์์ ๋ณด์ฅํ๋ฏ๋ก ๋ณ๊ฒฝํ ์ ์์)๊ฐ ์์ต๋๋ค.
๋น์ทํ ์๊ฐ์ ํ๊ณ ์์์ต๋๋ค. .NET์ "์ฝ๊ธฐ ์ ์ฉ"์ ํ๋์ ๋ํด์๋ ๋งค์ฐ ์ฝํ ๋ณด์ฅ์ ๋๋ค. do-over๋ฅผ ๊ฐ์ํ ๋ ์ด ๋ชจ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ผ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ง๊ธ์ ์ค์ฉ์ ์ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๊ฐ IReadOnlySomething<T>
๋ฅผ ์๋ฝํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์์ ๋ฉ์๋๊ฐ ์ฐธ์กฐ๋ฅผ ์
์บ์คํธํ์ง ์๋๋ค๋ ๋ณด์ฅ์ด ์์ผ๋ฉฐ ์ธํฐํ์ด์ค์ ๊ตฌํ์ด ์ก์ธ์ค๋ ๋ ๋ด๋ถ์ ์ผ๋ก ์์ฒด ์์ ๋์ง ์๋๋ค๋ ๋ณด์ฅ๋ ์์ต๋๋ค.
C++์์ const_cast
๋ const
์ ๋ณด์ฅ๋ ์ฝํ์ํต๋๋ค. ์ด๋ ์์น์ค๋ฌ์ด ์ผ์ด์ง๋ง(์์ฆ์ mutable
์์ ์๊ฐ ์์) ์ค์ ๋ก๋ ์ผ๋ง๋ ์ ์ฉํ์ง const
๋ ๊ธฐ๋ฅ์
๋๋ค. ๋น์ ์ ๋น์ ์ด ๋ฌด์์ ๋ค๋ฃจ๊ณ ์๋์ง ์์์ผํฉ๋๋ค.
@binki ๋ ์ ๊ตฌ๋ณ๋ฉ๋๋ค. ์ด๋ฆ์์ _Immutable_์ ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ ์ฑ์ ๋ณด์ฅํ๋ค๋ ์๋ฏธ์ ๋๋ค.
IList<T>
๊ฐ IReadOnlyList<T>
ํ์ฅํ์ง ์๋ ์ด์ ์ ๋ํ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ๊ฐ ์๋ ์ฌ๋์ด ์์ต๋๊น?
@binki
์ธํฐํ์ด์ค๋ ๋ณด๊ธฐ๊ฐ ์๋๋ผ ๊ณ์ฝ์
๋๋ค. ๊ทธ ๊ณ์ฝ์ ๊ตฌํ์์ ๋ฅ๋ ฅ์ ์ ์ธํฉ๋๋ค. ๊ตฌํ์๊ฐ ์ค์ ๋ก ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์ผ๋ฉด ๊ณ์ฝ ์๋ฐ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค. ํด๋น List<T>
ํด๋์ค๋ "is-a" IReadOnlyList<T>
๋ผ๊ณ ์ฃผ์ฅํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ ๋ฅ๋ ฅ์ด ๋ถ์กฑํฉ๋๋ค.
์ด ์ฃผ์ ์ ๋ํด ์ฌ๋ฌ ํํ๊ฐ ์์ต๋๋ค. ๋๋ ์ธํฐํ์ด์ค ์์์ด ์ ํ ๊ฐ์ "is-s-in" ๊ด๊ณ๋ฅผ ๋ ์๊ฒฉํ๊ฒ ๋ฐ๋ฅด๋ ํ๊ต์ ๋ถ๋ช
ํ ์ํด ์์ต๋๋ค. ๋๋ ํ์คํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ๋ํ ๋ณด๋ค ์ธ๋ถํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ง์ํ๊ณ List<T>
๋ฐ ๊ทธ ์น์ฒ์ด 3-4๊ฐ์ ์ถ๊ฐ ์ธํฐํ์ด์ค(์ฝ๊ธฐ, ์ฐ๊ธฐ, ์ถ๊ฐ ๋ฑ)๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ํ์คํ ์๊ฐํฉ๋๋ค. ์ธํฐํ์ด์ค ์ด๋ฆ์ ์ ํ์ด _ํ ์ ์๋_ ์ผ์ด ์๋๋ผ _ํ ์ ์๋_ ํ๋ ์ผ์ ์ค๋ช
ํด์ผ ํฉ๋๋ค. ๋ถ์ ์ ์ธ ๋ฅ๋ ฅ ์ฃผ์ฅ์ ๊ณ์ฝ์ ๋ณ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค.
@drewnoakes
์ง๊ธ์ ์ค์ฉ์ ์ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ ๋์ํ๋ค. ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ์๋ ๊ณณ์ ์์ต๋๋ค. IList<T>
๊ฐ IReadOnlyList<T>
๋ฅผ ํ์ฅํ๋๋ก ๋ณ๊ฒฝ๋๋ฉด ISet<T>
๊ฐ IReadOnlySet<T>
๋ฑ์ ํ์ฅํ๋๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค.
IReadableX<T>
, IWritableX<T>
๋ฑ์ ์ธํฐํ์ด์ค๋ฅผ IReadOnlyX<T>
์ ํจ๊ป ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ์ค๋ณต๋ฉ๋๊น?
IList<T>
๊ฐIReadOnlyList<T>
ํ์ฅํ์ง ์๋ ์ด์ ์ ๋ํด ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ๊ฐ ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋ถ๋ช
ํ ์ด์ .net ํ๋ ์์ํฌ์ ๋ํด ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ก๋ํ ๋ ABI๋ฅผ ๊นจ๋ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์
๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ ๋๋ถ๋ถ์ ์ปดํ์ผ๋ฌ๋ ์์ค ์ฝ๋๊ฐ ์์์ ์ธํฐํ์ด์ค ๊ตฌํ์ ์์กดํ ๋ ์๋์ผ๋ก ๋ช
์์ ์ธํฐํ์ด์ค ๊ตฌํ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ IList<T>
๊ฐ ์๋ BCL์ ๋ํด IList<T>
๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ปดํ์ผํ๋ฉด IReadOnlyList<T>
๊ตฌํํ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ช
์์ ์ธ IReadOnlyList<T>
๊ตฌํ์ ์๋์ผ๋ก ์์ฑํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์ด ๊ธ์ ์ฝ๊ณ ์๋ค๋ฉด: http://stackoverflow.com/a/35940240/429091
@HaloFour List<>
์ HashSet<>
๊ฐ ICollection<>
์ IReadOnlyCollection<>
๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ IReadOnly
๊ฐ ์ ๊ทผ์ด ์๋ ์ ๊ทผ์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ๋ก๋ฅผ ๋ฐ์๋ค์์ต๋๋ค. ๋ฅ๋ ฅ. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก IAnything
IReadOnlyAnything
ํ์ฅํ๋ ๊ฒ์ด ์๋ฒฝํฉ๋๋ค. IReadable
๊ฐ IReadOnly
๋ณด๋ค ๋ซ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ด ์์ ์์ ๋ชจ๋๊ฐ IReadOnly
๋ฅผ IReadable
_mean_ ์ดํดํ๊ณ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค. ์ฌ์ค, ๋๋ ์ฌ๋ฌผ์ ๋ํด ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์๊ฐํ๋ ๊ฒ์ด ๋ด ์๊ฐ์ ๊ทธ ์ด๋ค ๊ฒ๋ณด๋ค ์ธ์ง ๋ถํ๊ฐ โโ๋ ํฌ๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๋ด ์์ ์ ์ฝ๋๋ฒ ์ด์ค์์ ์์ํํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ ์ด๋ฆ์ ์ฝ๋งค์ฌ ์์ง๋ง ๊ทธ ์ด๋ฉด์ ๊ฐ๋
์ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ฒด ํด๋์ค์์ ํ๋ ๊ฒ์ฒ๋ผ ์์ผ๋ก ๋ชจ๋ ์ธํฐํ์ด์ค๊ฐ IReadOnly
๋ฅผ ํ์ฅํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ๋ฅผ ์ง์ ์ผ๋ก ๋ฐ๋ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋ ฅํฉ๋๋ค.
@ashmind ์ด๋ค ๋ฐฉ๋ฒ๋ ๋น๊ต์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์๋ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธํธ์ ์ฌ์ ์์ ๋น๊ต์๋ ์ ์ฒด ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ ๊ฒ์ด ์๋๋๋ค. ๋ํ CaseInsensitiveStringCollection
๋๋ ํน์ ๋น๊ต๋ฅผ ์์ํ๋ ์ปฌ๋ ์
์ ๋น๊ต์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์์ต๋๋ค.
(์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ฅ ๋ฉ์๋ ๋ณด๋ค Contains(T, IEqualityComparer<T>)
๋ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ์ด์ํ ์ปฌ๋ ์
์ ๊ฒฝ์ฐ ์๋ง๋ ์ผํ์ฑ ํด๋์ค ๋ฉ์๋์ผ ๊ฒ์
๋๋ค. Contains(T, IEqualityComparer<T>)
๊ฐ ์ผ๋ฐ์ ์ด๋ผ๊ณ ์์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ ๋ฌธํ๋ ์ธํฐํ์ด์ค๋ก ๋๋๊ธฐ์ ์ถฉ๋ถํ์ง๋ง ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋์ง ์๋๋ก ๋ง์ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.)
@jnm2
์ด๋ค ๋ฐฉ๋ฒ๋ ๋น๊ต์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์๋ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ช ํํํ๊ธฐ ์ํด ๋น๊ต์๋ฅผ ๋ ธ์ถ์ํค๋ ๊ฒ์ด ์๋๋ผ ๋ ธ์ถํด์ผํ๋ค๊ณ ๋งํ๊ณ ์ถ์์ต๋๋ค. ๋ชจ๋ Set ๋๋ Dictionary์๋ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ด ์์ด์ผ ํ๋ฏ๋ก ์ธํฐํ์ด์ค์ ๋ ธ์ถ๋์์ ์ ์์ต๋๋ค. ํ์ง๋ง ์ง๊ธ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ธฐ์ต๋์ง ์์ต๋๋ค. ์ธ๋ถ์์ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋์ผํ ๋น๊ต์๋ฅผ ์ฌ์ฉํ์ฌ ์งํฉ์ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
์ด ํ ๋ก ์์ ํฅ๋ฏธ๋ก์ด ์ ๋ค์ด ๋ง์ด ๋์ค์ง๋ง, ์ด ์ค๋ ๋๋ฅผ ์์ํ ๊ฐ๋จํ๊ณ ๋ถ๋ช ํ ์ ์๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ผ๋ฉด ํ๋ ๋ฐ๋์ ์ค๋ง์ค๋ฝ์ต๋๋ค.
OP๊ฐ ๋งํ๋ฏ์ด IReadOnlySet ์์ด IReadOnlyList๊ฐ ์ถ๊ฐ๋์์ ๋ ์ปฌ๋ ์ ์ ํ ๊ฐ์ ํจ๋ฆฌํฐ๋ฅผ ์ ์งํ์ง ๋ชปํ ๊ฒ์ ๋ถํํ ์ผ์ด๋ฉฐ ๋ง์ ์ฌ๋๋ค์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์์ฒด ๋ฒ์ ์ IReadOnlySet ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ต๋๋ค(์ ์ ํ๋ ๋น์ทํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค). ์ด๋ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ธํฐํ์ด์ค๋ corefx ํด๋์ค์์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์์ ์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ด ํ๋ ์์ํฌ์์ ์ด๊ฒ์ ์ ๊ณตํ๋ ์ฃผ์ ์ด์ ์ ๋๋ค. HashSet์ด ์๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ๋ํํ์ง ์๊ณ 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 ์ธํฐํ์ด์ค์ ๋ ์ผ์นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@aaron-meyers ๋ด๊ฐ ๊ฐ์ง ์ ์๋ ์ ์ผํ ๊ฑฑ์ ์ IsSubsetOf
์ ์น๊ตฌ๊ฐ Contains
์์ _ํจ์จ์ ์ธ_ ๋ฐฉ์์ผ๋ก ํ์๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ํด์ ํ
์ด๋ธ์ด ๋ ๊ฐ์ธ ๊ฒฝ์ฐ Contains
์ ์์กดํ๋ฉด ๊ตฌํ์์ ํด์ ์ผ์น๊ฐ ์๋ ์ค์ฒฉ ๋ฃจํ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์๋ง๋ ์๋ก์ด ์ธํฐํ์ด์ค์ธ IComparableSet<T>
์๋ ์งํฉ ์์
์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์งํฉ ์์
์ ๋ํด IEnumerable<T>
๋ํ ํ์ฅ ๋ฉ์๋๊ฐ ์ด๋ฏธ ์์ต๋๋ค.
@jnm2 HashSet์์ ์ฌ์ฉํ๋ ์ด๋ฌํ ๋ฉ์๋ ์ IReadOnlySet ์
์์ ๋ ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
IEqualityComparer<T> Comparer { get; }
bool Contains(T item);
}
๋๋ Comparer๊ฐ ๋ณ๋์ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ฉฐ ์ค์ ์์
์ ํ์ฅ ๋ฉ์๋ ๊ตฌํ์ ๋ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ๋์ผํ ๋น๊ต์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ํจ์จ์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. IReadOnlyDictionary์ ๋ํด ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ ์ ์์ต๋๋ค(์ฌ์ค, ์๋ง๋ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํจ). ISetComparable๊ณผ ๊ฐ์ ๊ฒ. ๋๋ @drewnoakes ์์ ๊ทธ๋ฆผ์
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
/// <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 Framework ๋ฆด๋ฆฌ์ค์ ์ถ๊ฐํ ๊ณํ์ ๋๊น?
์ด ์ํ์ ์ธ์ ์๋ฅํ๋์? ํ์๋ผ์ธ์ด ์๋์?
https://www.nuget.org/packages/System.Collections.Immutable/
๋ถ๋ณ ์ปฌ๋ ์
์ ์ ์ฒด ์ธํธ)
์ข์์. ์ด๊ฒ์ ๋๋ฌด ์ค๋ซ๋์ ์ฌ๊ธฐ์ ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ํ์ํ๋ฉฐ ์ด์ ๋ํ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๋ ธ์ถํ๋ ๋์ :
IEqualityComparer<T> Comparer { get; }
bool IsProperSubsetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
๊ณ ๊ฐ์ด ์ด๋ฌํ ๊ตฌ์ฑ์์ ๊ตฌํํ๋๋ก ํ๋ ค๋ฉด ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
public interface IReadOnlySet<out T> : IReadOnlyCollection<T>
{
bool Contains<T>(T item);
}
๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ์๋ฌด๊ฒ๋. ์ด๋ฌํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ๋ง์ API๊ฐ ํฅํ์ ํญ์ ์ถ๊ฐ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๊ฑฐํ ์ ์์ผ๋ฏ๋ก ์ด ์ ์.
๊ทธ๋ฐ ๋ค์ ์ด ์ธํฐํ์ด์ค๋ฅผ ISet<T>
ํ์ฅ๋ ์ธํฐํ์ด์ค ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค.
๋ฌธ์์์
ISet<T>
: ์ด ์ธํฐํ์ด์ค๋ ๊ณ ์ ํ ์์์ ํน์ ์์ ์ด ์๋ ์ปฌ๋ ์ ์ธ ์งํฉ์ ๊ตฌํํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ํด์์ ๋ฐ SortedSet ์ปฌ๋ ์ ์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. ์ฝ๋์์
ISet<T>
์ธํฐํ์ด์ค์๋ ์ด๋ฏธICollection<T>
๋ฅผ ํตํด ์ ์๋bool Contains<T>(T item);
๋ฉ์๋๊ฐ ์์ต๋๋ค.int Count { get; }
๋ฅผ ํตํดICollection<T>
์์ต๋๋ค.
๊ทธ๋ ๊ฒ ๋ ๊ฒ์ ๋๋ค :
public interface ISet<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlySet<T>
์ฌ์ํ ๋ณ๊ฒฝ, ๋ ผ์ํ ์ฌํญ์ด ๊ฑฐ์ ์๊ณ ํฐ ์ด์ ์ด ์์ต๋๋ค.
ํ๋๋ก ํฉ์๋ค. ๊ทธ๋ฌํ ํ ์์ฒญ์ด ์๋ฝ๋๊ณ ๋ณํฉ๋๋์ง ์๋ ค์ฃผ์ธ์. ๊ทธ๋ฌ๋ฉด ๋ง๋ค ์ ์์ต๋๋ค.
@karelz @terrajobst @safern @ianhays
์ฝ๊ธฐ ์ ์ฉ ์งํฉ ์์ ์ ์ฌ์ ์ ํค ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ค๋ ์ค์ ๋ฌธ์ ์ ๋ํด ์์ ํ ๋ ์ด ํ ๋ก ์ ์ฐพ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ ๊ฐ ์ ์ํ๋ API๊ฐ ์์ต๋๋ค.
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 ์ค๋ ๋์ API ์ ์์ ์ถ๊ฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทผ๊ฑฐ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ์๊ฒ ์ต๋๊น? ๊ฒํ ํ ์ค๋น๊ฐ ๋ ๊ฒ์ผ๋ก ํ์ํ๊ณ API ์ ๋ฌธ๊ฐ๊ฐ ๊ฒฐ์ ํ๋๋ก ํ์๊ฒ ์ต๋๊น?
@TylerBrinkley ๋
@dmitriyse getter๋ IEqualityComparer<T>
์์ฑ๋ง ์ฌ์ฉํ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ผ๋ก ๋ฌด์์ ํ์๊ฒ ์ต๋๊น?
์ฌ์ ๋ฐ ์งํฉ์ ์ฌ๋ฐ๋ฅธ ์ปฌ๋ ์
๋ณต์ ๋ฅผ ํ์ฉํ๊ธฐ ์ํด EqualityComparers๋ฅผ ๋ณด๊ณ ํด์ผ ํฉ๋๋ค.
๋ถํํ๋ ์ด ๋ฌธ์ ๊ฐ ๋
ผ์๋ ๊ณณ์ ์์ด๋ฒ๋ ธ์ต๋๋ค.
ํด๋ก๋์ ํ๋ฉด ์ฝํฌ๋ฆฌํธ ํ์
์ผ๋ก ์์
ํ์ง ์์๊น์? ์ธํฐํ์ด์ค๊ฐ IEqualityComparer<T>
๋ฅผ ์ง์ํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์๋ฅผ ๋ค์ด ๋ฌธ์์ด๊ณผ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๋ ํ๋ฑ ๋น๊ต์๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ EqualityComparer๋ฅผ ์ง์ ํ์ง ์๊ณ ์ HashSet์ ๋ง๋ค ๋ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ง์ ๋ ์งํฉ์์ ์ด๋ค EqualityComparer๊ฐ ์ฌ์ฉ๋์๋์ง ์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
๋จ์ํ ๋ณต์ ๊ฐ ์๋๋๋ค. ํจ์ฌ ๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋ ์ธํธ๋ฅผ ๋น๊ตํ๋ ๊ฒ์ ๋๋ค. Contains๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ์ ๋น๊ต๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ ๋ค ๋์ผํ ๋น๊ต์๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์์์ผ ํฉ๋๋ค. ์ด ์ค๋ ๋์ ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฆ, IReadOnlySet์ ์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ณด๋ค Contains ๋ฉ์๋๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Set ๋น๊ต๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง Set์ ๋ํ ์ฝ๊ธฐ ์ ์ฉ ์ฐธ์กฐ๊ฐ ํ์ํ ๋งํผ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค.
iOS์ฉ Outlook ๋ค์ด๋ก๋ https://aka.ms/o0ukef
๋ณด๋ธ ์ฌ๋: Tyler Brinkley [email protected]
๋ณด๋ธ ๋ ์ง: 2018๋
5์ 10์ผ ๋ชฉ์์ผ ์ค์ 6:21:52
๋ฐ๋ ์ฌ๋: dotnet/corefx
์ฐธ์กฐ: ์๋ก ๋ง์ด์ด์ค; ์ธ๊ธํ๋ค
์ ๋ชฉ: Re: [dotnet/corefx] IReadOnlySet ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๊ณ HashSet, SortedSet์ด ๊ตฌํํ๋๋ก ํ์ญ์์ค(#1973).
ํด๋ก๋์ ํ๋ฉด ์ฝํฌ๋ฆฌํธ ํ์
์ผ๋ก ์์
ํ์ง ์์๊น์? ์ธํฐํ์ด์ค๊ฐ IEqualityComparer๋ฅผ ์ง์ํด์ผ ํ๋ ์ด์
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388051258&data=02์์ ํ์ธํ์ธ์. 7C01 7C % % % % 7Cc45ea16cd3034ddd69d808d5b678ff33 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636615553141417289 ๋ฐ SDATA = xRI27JtyaAwnZ2anY05oTlxmPY5AaGVl 2BRdXK2uR0 % % % 2F8 ๋ฐ 3D = 0 ์์ฝ ๋๋ ์ค์ ์๊ฑฐ https://eur01.safelinks.protection.outlook.com/?url=https%3A% 2F % 2Fgithub.com % 2Fnotifications % 2Funsubscribe-% 2FAMuQLmqboBWyHweWHSUoE1YM2OrfHZZxks5txD7wgaJpZM4E9KK- ์ธ์ฆ ๋ฐ ๋ฐ์ดํฐ = 02% 7C01 % 7C % 7Cc45ea16cd3034ddd69d808d5b678ff33 % 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636615553141417289 ๋ฐ SDATA = hLtAXEyFNVEgWike6tMwAfUVC % 2BucyjXUDwoLOLDV5gk % ๋ฐ 3D = 0 ์์ฝ .
๋์ํฉ๋๋ค. ์งํฉ์์ ์ฐพ์ ์ ์๋ ์ค๋ณต ์ ํ(๋์๋ฌธ์ ๊ตฌ๋ถ, ๋์๋ฌธ์ ๊ตฌ๋ถ ๋ฑ)์ ์ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋น๊ต์๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ ๋๋ค.
Dictionary<TKey, TValue>.KeyCollection
์ด๋ฌํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๋ฉด ์๋นํ ์ฝ๋ ํฌ๊ธฐ ๋น์ฉ์ด ๋ฐ์ํ๋ฏ๋ก ๋ด ์ ์์ด ๋ฐ์๋ค์ฌ์ง์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ธ์คํด์คํ๋๋ ์ ๋ค๋ฆญ ์ ํ์ ์ API๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ด
๋๋ ๋น์ ์ด IReadOnlySet
์ ๋น๊ต์๋ฅผ ๋ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
SortedSet
๋ IComparer
๋ฅผ ๋ฐ๋ ๋ฐ๋ฉด HashSet
๋ IEqualityComparer
๋ฐ์ต๋๋ค.
์ข์ ์ , ๋น๊ต์๋ ์ผ๋ฐ ์ธํฐํ์ด์ค์ ์ํ์ง ์๋ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
iOS์ฉ Outlook ๋ค์ด๋ก๋ https://aka.ms/o0ukef
๋ณด๋ธ ์ฌ๋: Cory Nelson [email protected]
๋ณด๋ธ ๋ ์ง: 2018๋
5์ 10์ผ ๋ชฉ์์ผ ์คํ 5:04:06
๋ฐ๋ ์ฌ๋: dotnet/corefx
์ฐธ์กฐ: ์๋ก ๋ง์ด์ด์ค; ์ธ๊ธํ๋ค
์ ๋ชฉ: Re: [dotnet/corefx] IReadOnlySet ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๊ณ HashSet, SortedSet์ด ๊ตฌํํ๋๋ก ํ์ญ์์ค(#1973).
๋๋ ๋น์ ์ด IReadOnlySet์ ๋น๊ต์๋ฅผ ๋ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
SortedSet์ IComparer๋ฅผ ์ฌ์ฉํ๊ณ HashSet์ IEqualityComparer๋ฅผ ์ฌ์ฉํฉ๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388221165&data=02์์ ํ์ธํ์ธ์. 7C01 7C % % % % 7C0ef6d84125be4c450fdc08d5b6d2b70a 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636615938478979295 ๋ฐ SDATA = PHkDQPiJBEIks8yNyIA7vKODM % 2BkMFI4PRX4lUUBu % 2Bi0 % ๋ฐ 3D = 0 ์์ฝ ๋๋ ์ค์ ์๊ฑฐ https://eur02.safelinks.protection.outlook.com/?url=https%3A% 2F % 2Fgithub.com % 2Fnotifications % 2Funsubscribe-% 2FAMuQLu5JGLcqrpMyGWLygbCsaSQSXFgNks5txNV2gaJpZM4E9KK- ์ธ์ฆ ๋ฐ ๋ฐ์ดํฐ = 02ํผ์ผํธ 7C01 % 7C % 7C0ef6d84125be4c450fdc08d5b6d2b70a % 7C84df9e7fe9f640afb435aaaaaaaaaaaa % 7C1 % 7C0 % 7C636615938478979295 ๋ฐ SDATA = 9pnuMULuDu9HWb7un % 2FWYq6iYdjTKFsjN7nKiToaeHkk % ๋ฐ 3D = 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
return true
. ์ง์ํ ๊ฒ์ผ๋ก ์์๋๋ ์ ์ผํ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ด๊ฑฐ ๊ฐ๋ฅํ Count
์์ฑ๊ณผ ๋๋ฌด ์ ํ์ ์ผ๋ก ๋ณด์ด์ง ์๋ CopyTo
๋ฉ์๋์
๋๋ค.
์ ์๋ IReadOnlySet<T>
๊ฐ IReadOnlyCollection<T>
๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋ค๋ฉด ๋งค์ฐ ๊ธฐ์ ๊ฒ์
๋๋ค. ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ๋ํ ํฐ ๊ฐ์ ์ด ๋ ๊ฒ์
๋๋ค. (@TylerBrinkley์ - ๋น์ ์ด ์๋ฏธ ๊ฐ์ IReadOnlyCollection<T>
๋์ ICollection<T>
.
๋ ๊ธฐ๋ณธ์ ์ธ ์ธํฐํ์ด์ค์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Set์ ๋ํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด Contains
๋ฉ์๋๊ฐ ์๋ ๋จ์ผ ๋ฉ์๋ ์ธํฐํ์ด์ค๊ฐ ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ข์ ์ํ์ ๊ธฐ์ด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๊นจ๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์กด ํด๋์ค๋ก ๊ฐ์กฐํ ๋๋ ๊ฐ์กฐ๋ฅผ ๋ ํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ์ธ์ ํ๋ฉฐ ์ธํฐํ์ด์ค๊ฐ ํ๋๋ง ๊ฐ์กฐ๋์ด์ผ ํ๋ค๋ฉด IReadOnlySet<T>
๊ธฐ๋ฐ IReadOnlyCollection<T>
์ด์ด์ผ ํฉ๋๋ค.
IReadOnlyCollection<>
์๋ .Contains
IReadOnlyCollection<>
๊ฐ ์์ต๋๋ค. ๊ณต๋ณ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ข์ ์ง์ ์ด๋ฉฐ ์ด์ ๊ฒ์๋ฌผ์ ๋ฐ๊ณต๋ณ์ผ๋ก ์์ ํ์ต๋๋ค. ์ค๋ ๋์ ์ด๊ธฐ์ ๊ฒ์๋ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ์ฉ๋์ง ์๋ ํ IReadOnlySet<T>
๋ ๋ถ๋ณํด์ผ ํ๋ฉฐ ์ด์ ๋ํด ํ์ ์ด ์์ง ์์ต๋๋ค.
@TylerBrinkley ๊ฐ์ธ์ ์ผ๋ก ์ ๋ IsReadOnly
์์ฑ์ ํฌ์ด ์๋๋ฏ๋ก ๋ฐํ์ ๋์ ์ปดํ์ผ ํ์์ ์ด ์ ๋ณด๋ฅผ ์๊ณ ์ถ์ต๋๋ค. IReadOnlyCollection<T>
์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ํธ์ถ์ ๋๋ ์์ ์๊ฐ ์ปฌ๋ ์
์ ํตํ ์ ์ฌ์ ๋ฐ๋ณต ๋์ ์กฐํ๊ฐ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ฌ์ ํ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. "์ธํธ"๋ ๊ทธ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Contains
๋ฉ์๋ Set
๊ฐ ํด์ผ ํ ์ผ์ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ Collection
๊ฐ ํด์ผ ํ ์ผ์ ์ ์ํฉ๋๋ค. ๋ด ๋ง์ Contains
๋ ISet
์ ๊ตฌ์ฑ์๋ ์๋์ง๋ง ISet
์์๋ฐ์ ICollection
์ ๊ตฌ์ฑ์์
๋๋ค. ISet
์ ๋ค๋ฅธ ๊ตฌ์ฑ์์ Set
์ด ์ํํด์ผ ํ๋ ์์
์ ์ ์ํด์ผ ํฉ๋๋ค. ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด Contains
๋ฐฉ๋ฒ์ ๋ํด์๋ง ์ธํธ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ธํธ์๋ ๊ทธ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ์์ต๋๋ค.
@TylerBrinkley ํ์ง๋ง ์ด ์์ ์์ IReadOnlyCollection<T>.Contains(T)
๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? ๋๋ ์๋๋ผ๊ณ ๊ฐ์ ํ๋ค. ์ด๊ฒ์ด ์ ์ผํ ์ต์
์ด IReadOnlySet<T>
๋ฅผ ๋์
ํ๊ณ ๋์
๋ ๋ IReadOnlySet<T>.Contains(T)
๊ฐ ์ ์ธ๋์๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค.
@jnm2 ๋งํ๋ค:
IReadOnlyCollection<>
์๋.Contains
IReadOnlyCollection<>
๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ณต๋ณ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๊ฒ์ด ์ง๊ธ ๋์๊ฒ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค. ํ์ ๊ฒ IReadOnlySet<T>
๋ ๋ถ๋ณ์ผ๋ก IReadOnlyCollection<T>
๊ณต๋ณ์
๋๋ค. ๊ธฐ์กด์ ๋ง์ IReadOnly*
์ธํฐํ์ด์ค๊ฐ out T
๋ก ์ ์คํ๊ฒ ์ค๊ณ๋์์ผ๋ฉฐ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ ๋ฐ๋์ ๋ถ๋ณ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ ๋๋ถ๋ถ์ IReadOnlySet<T>
๊ฐ ์ต์ํ Contains(T)
๋ฉ์๋๋ฅผ ์ ์ธํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ณต๋ณ์ฑ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
ICollection
์ ๋ง Contains(T)
๋ฅผ ์ ์ํ ์ ์๋ ์ฌ๋ฐ๋ฅธ ์์น๋ผ๋ฉด ๊ฐ๋ฅํ๊ฐ์? Collection<T>
๋ฐ HashSet<T>
์ํด ๊ตฌํ๋๊ณ ๋ถ๋ณ์ธ IReadOnlyProbableCollection<T>.Contains(T)
์ผ ์ ์์ต๋๊น?
@NickRedwood์ ISetCharacteristic<T>
์ ์์ด ๋ ๊น๋ํด ๋ณด์
๋๋ค. ์ฌ์ง์ด ์ ์ฉํ ์ ์๋ Count
๋ฅผ ๊ตฌํํ์ง ์์๋ ๋๋ค๋ ์ด์ ์ด ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ IsReadOnly ์์ฑ์ ํฌ์ด ์๋๋ฏ๋ก ๋ฐํ์ ๋์ ์ปดํ์ผ ํ์์ ์ด ์ ๋ณด๋ฅผ ์๊ณ ์ถ์ต๋๋ค.
๊ทธ ์ฌ๋์ ๋ง์ ์ํ๋ ํฌ๋์ฃผ๋ฅผ ๋ ๋ถ์ด ์ฃผ์ญ์์ค.
@binki IReadOnlyCollection<T>
๊ฐ ํฌํจ๋์ง ์์๊ธฐ ๋๋ฌธ์ IReadOnlySet<T>
์ Contains
๋ฉ์๋๊ฐ ์์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๋น ๋์ฐ๋ณ์ด ISet<T>
๋ ์๊ฐํฉ๋๋ค
์์์ ์ธ๊ธํ Dictionary.KeyCollection
์ฌ์ฉ ์ฌ๋ก ์ธ์ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ด๋ค ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํด๋ผ ์ ์์ต๋๊น?
์ข์ต๋๋ค. API ๋์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
}
๋ชจ๋๊ฐ ๋์ํ ์ ์๋ ๋์์ธ์ ์ ์ผํ ๊ณตํต ๋ถ๋ถ์ ๋๋ค.
์ด์ ์ฌ๊ธฐ์ ๋์์ธ์ ๋ง์น๊ฒ ์ต๋๋ค. ์์ผ๋ก ์ฐ์ฅํ๊ณ ์ถ๋ค๋ฉด ๋ค๋ฅธ ํธ์์ ํ์ธ์. ์ด๊ฒ์ ์ ํ์ ์์ด์ผ ํ๋ ๊ฐ์ฅ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค.
๋๊ตฌ๋ฅผ ์ํ ๊ฒ์ธ๊ฐ, ๋๊ตฌ๋ฅผ ๋ฐ๋ํ๋ ๊ฒ์ธ๊ฐ?
@ashmind ์ ์ ์์ด ๋ง์์ ๋ญ๋๋ค . Dictionary.Keys๊ฐ ๊ธฐ์ ์ ์ผ๋ก IReadOnlySet<TKey>
์ธ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์
๋๋ค.
์ด๊ฒ์ api-ready-for-review
๋ก ํ์ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ์ด ์ธํฐํ์ด์ค๊ฐ ๋ค์ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ ์ฌ์ ํ ์กด์ฌํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ์์ง ๊ตฌํ๋์ง ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
[ํธ์ง] ์ฌ๊ณผ - ๋ด ์๋ ์๋ต์ด ๋ค๋ฅธ API์ ํผ๋๋์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๊ฐํ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ํ ์คํธ๊ฐ ํธ์ง๋์์ต๋๋ค. ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค!
์ด๊ฒ์ด ์์ง ๊ตฌํ๋์ง ์์ ์ด์ ๋ ๋ฌด์์ ๋๊น?
API๋ ์์ง ์์ญ ์์ ์์ ๊ด์ฌ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค - @safern. ์ปฌ๋ ์
์ฐ์ ์์ ๋ชฉ๋ก์์ ์ผ๋ง๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ง์ง์จ์ด ์๋นํ ๋์ต๋๋ค.
์ง์ค์ ํ์ฌ .NET Core 3.0์ ์ ๊ทธ๊ณ ์์ผ๋ฏ๋ก 3.0์์๋ ์ค์ํ์ง ์์ผ๋ฏ๋ก ์ต์ํ ๋ค์ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ด ๊ธฐ๋ณธ ์ ๊ณต๋์ง ์๋๋ค๋ ๊ฒ๋ ๋๋์ต๋๋ค.
๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ํฐ ๋์์ด ๋ ์ ์์ง๋ง ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ง์ ํ๊ณ ์๋ก ๋ค๋ฅธ ๊ตฌํ์ด ํจ๊ป ์๋ํ๋๋ก ํ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํฐํ์ด์ค ์์ด๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด๊ฒ์ด ์์ผ๋ฉด ๋ถ๋ณ ์งํฉ์ ๋งค๊ฐ๋ณ์/๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ ํจ์จ์ ์ด๊ณ ์๋ฏธ๋ก ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด์ง ์์ IEnumerable์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ์ฌ๋์ ์๋ช ๊ณผ ํธํ๋์ง ์๋ ์์ฒด ์ธํฐํ์ด์ค/ํด๋์ค๋ฅผ ์๋ช ์ ์ฌ์ฉํ๋ ๋ฐ ์์กดํด์ผ ํฉ๋๋ค.
Contains
์กฐํ ์ธก๋ฉด์์ ํจ์จ์ ์ด๊ณ ๋งค๊ฐ๋ณ์/๋ฐํ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ์ง์ ํ์ง ์๋ ์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์์ ์๊ฐํ ์ ์๋ ์ต์ ์ ์๋ช
์์ IEnumerable์ ์ฌ์ฉํ๊ณ ReadOnlyDictionary.Keys๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด์ง๋ง, ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ฝ๊ฐ ๋ถ์พํ ๊ฒ ๊ฐ์ต๋๋ค. Linq์ Enumerable.Contains
๋ Contains
์ ์ปฌ๋ ์
๊ตฌํ์ ์ฌ์ฉํ๋ฏ๋ก ํธํ๋๋ ๋์ ํจ์จ์ ์ด์ด์ผ ํ์ง๋ง ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ตฌํ์ ์ฌ์ฉํ ์ ์๋ ์๋๋ฅผ ์ ๋ฌํ์ง ์์ต๋๋ค.
@adamt06 ISet<T>
์ฐพ๊ณ ์์ต๋๋ค.
@scalablecory ๋น์ ์ด ์ณ์ต๋๋ค. ๋ณ๊ฒฝํ ์ ์๋ ๊ตฌํ์ด ์์ผ๋ฉฐ ImmutableHashSet<T>
ICollection์ด ์ ๊ทธ๋ฐ์ง ์๊ณ /์ดํดํ๋ ์ฌ๋์ด ์์ต๋๊น?
๋๋ ์ด๊ฒ์ด ์ด ์ค๋ ๋์ ์ฝ๊ฐ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ ์ค๋ ๋๋ฅผ ์ฌ๋ ๋์ . ์ด์ฉ๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์คํดํ๊ณ ์๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์๊ฐ์ด์ง๋ง ์ฃผ์ ์์ ์์ ํ ๋ฒ์ด๋ฌ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 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>
์ฝ๊ธฐ/์ฐ๊ธฐ ์ปฌ๋ ์
์ด ์ฝ๊ธฐ ์ ์ฉ ์ปฌ๋ ์
์ ํ์ฅ์ด ๋์ด์๋ ์ ๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@generik0
์ข์์. ๊ทธ๋ฌ๋ ์ฌ์ ํ ICollection์ด ๋ค์๊ณผ ๊ฐ์ด ํ์๋์ง ์์์ผ ํฉ๋๋ค.
ICollection<out T> : IReadOnlyCollection<out T>
์ฝ๊ธฐ/์ฐ๊ธฐ ์ปฌ๋ ์ ์ด ์ฝ๊ธฐ ์ ์ฉ ์ปฌ๋ ์ ์ ํ์ฅ์ด ๋์ด์๋ ์ ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋จผ์ ICollection<T>
์๋ .Add(T item)
๋ฉค๋ฒ๊ฐ ์์ผ๋ฏ๋ก ICollection<out T>
๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๋์งธ, ICollection<T>
๋ .net-2.0์ ํ์ ๋๊ณ IReadOnlyCollection<out T>
๋ .net-4.5์ ํ์ ๋ฉ๋๋ค. ICollection<T>
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ค์ ICollection<T>
๊ฐ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ๋ณ๊ฒฝ๋๋ฉด ICollection<T>
๋ง ๊ตฌํํ๋ ๋ชจ๋ ํญ๋ชฉ์๋ ํด๋น ๋ฐ์ด๋๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ๋ฐํ์์ ์ค๋จ๋ฉ๋๋ค. IReadOnlyCollection<T>
์ฌ๋กฏ์ ์ปดํ์ผ๋ฌ์ ์ํด (์๋์ผ๋ก) ์ฑ์์ง๋๋ค. ์ด๊ฒ์ ICollection<T>
๊ฐ IReadOnlyCollection<T>
๋ฅผ ๊ตฌํํ์ง ๋ชปํ๊ฒ ํ๋ ํธํ์ฑ ๋ฌธ์ ์
๋๋ค.
๋๋ ์ด๊ฒ์ด ์ด SO ๋ต๋ณ์ ์ํด ๋ช ํํ๊ฒ ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ์ด์ ๋ํ SO๊ฐ ์์ต๋๋ค: https://stackoverflow.com/a/14944400 .
@binki "
DotNetStandard ๋ฐ net461. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ณํ๊ฐ ์์ด์ผ ํ ๊ณณ์
๋๋ค. ๋ท์คํ ๋ค๋ 2+
๋ฐ๋ณตํ๊ฒ ์ต๋๋ค...
์ฝ๊ธฐ/์ฐ๊ธฐ ์ปฌ๋ ์
์ด ์ฝ๊ธฐ ์ ์ฉ ์ปฌ๋ ์
์ ํ์ฅ์ด ๋์ด์๋ ์ ๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๊ทธ๋ฆฌ๊ณ ๋ ๋ ธ์ถ์ํค๊ธฐ ์ํด ์๋ฅผ ๋ค์ด "ToArray()"๋ก ์ปฌ๋ ์ ์ ์บ์คํ ํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๊ณ ์์ ๋ฒ์ ์ ์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ICollection์๋ ์ด๋ฏธ IReadOnlyCollection ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ฃผ์์ ๊นจ์ ธ์ผ ํฉ๋๋ค... :-/
@generik0 ๋น์ ์ด ์๊ฐํ๊ณ ์๋ ์์ค ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค [์๊ฐํ์ง ์์์ต๋๋ค; ๊ทธ๋ด ๊ฒ์ด๋ค], ํ์ง๋ง C#์ด ์๋ IL ํ
์ด๋ธ์์ ์๋ํ๋ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ๊นจ๋จ๋ฆด ๊ฒ์
๋๋ค.
์ข์ @jnm2 ๊ฐ์ฌํฉ๋๋ค.
๋๋ ์ด์ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ํธ์ธ์ฅ๋ด์ ์ค๋จํ ๊ฒ์
๋๋ค. ๋จ์ง ๊ทธ๊ฒ์ด ๋์ ์ํคํ
์ฒ๋ผ๊ณ ์๊ฐํ์ญ์์ค. ๋ค์ด์ฃผ์๊ณ ์ค๋ช
ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค :-)
@jnm2
@generik0 ๋น์ ์ด ์๊ฐํ๋ ์์ค ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง C#์ด ์๋ IL ํ ์ด๋ธ์์ ์๋ํ๋ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
(์ฃ์กํฉ๋๋ค.) ์์ค๊ฐ .net-4.5 ์ด์ ๋ฒ์ ์์ ๋ช
์์ ์ผ๋ก ICollection<T>
๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ์์ค ํธํ์ฑ๋ ๊นจ์ง๋๋ค. IReadOnlyCollection<T>.Count
๋ฅผ ๋ช
์์ ์ผ๋ก ๊ตฌํํ์ง ๋ชปํด ํด๋์ค๊ฐ ์ปดํ์ผ๋์ง ์๊ธฐ ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ๊ด๋ฒ์ํ .net ๋ฒ์ ์ ๋์์ผ๋ก ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ ๋ ํฐ ๋ฌธ์ ์
๋๋ค. ์ด์ ํ๋ ์์ํฌ๋ฅผ ๋์์ผ๋ก ํ๋ ๋์ ๋ ๋ค ๋์์ผ๋ก ์ง์ ํด์ผ ํจ).
ICollection<T>
๊ฐ .NET Core 3.0+์ ๋ํด IReadOnlyCollection<T>
๋ฅผ ๊ตฌํํ ์ ์๋์ง C#8์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค ๊ตฌํ ์ง์์ด ์ถ๊ฐ๋์๋์ง ๊ถ๊ธํฉ๋๋ค.
ํ์ฅ์ด ํ์ํ ์๋ ์๊ณ ์ต์ํ ๋์ผํ ์ปฌ๋ ์ ์ผ ์๋ ์์ต๋๋ค. ienumerable ๋๋ icollection์ reaadonlycollection์ผ๋ก ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ ... ์ด๋ค ์๊ฐ์ด ์์ผ์ญ๋๊น?
[ @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
๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@jnm2 ์ด . ๋น์ ์ด ๋ง์ต๋๋ค. ๊ฐ๋์ ๋ช ๋ฃํ ๊ทธ๋ฆผ์ด ์ ๋ณด์ด๊ณ ๋๋ฌด ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค!!!
๋๋ ๋จ์ํจ์ ์ป๊ธฐ ์ํด ์ฌ์ ํ ํ์ฅ์ ํธ์ถ ํ ๊ฒ์
๋๋ค ;-)
๊ณ ๋ง์ ์น๊ตฌ....
์ฌ๊ธฐ ์ํ๊ฐ ์ด๋ป์ต๋๊น? ๋๋ ํ์ค lib์์ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๋ง ์ํ๊ณ HashSet<>๊ฐ ๊ทธ๊ฒ์ ๊ตฌํํ๋๋ก ํฉ๋๋ค.
Shapes ์ ์์ด (์ํ๋ฉด) ๊ตฌํ๋ ๋๊น์ง ์ ์ ๋ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ํ๋ ์ธํธ ์ ํ์ ๋ํ๋ด๋ ๋ชจ์ ๊ทธ๋ฃน์ ๋ง๋ค๊ณ HashSet<T>
์ ๊ฐ์ ๊ธฐ์กด ์ธํธ๊ฐ ์ด๋ฅผ ์ค์ํ๋๋ก ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ ํํ ์ด๊ฒ์ ์ํํ๋ ์ปค๋ฎค๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ์ฅํ ์ ์์ผ๋ฉฐ, ๋ค์ํ ์ ํ์ ์งํฉ(๋ดํฌ(์ ์ด) ๋ฐ ํ์ฅ(๋์ด๋จ), ์ ๋ ฌ, ๋ถ๋ถ ์ ๋ ฌ, ์ ๋ ฌ๋์ง ์์, ์ ์ ์์, ์ ์ ์๋ ๋ฌดํ, ์ ์ ์๋ ๋ฌดํ, ๊ฐ๋ฅํ๊ฒ๋ Rational๊ณผ ๊ฐ์ ์ํ์ ๋๋ฉ์ธ ํฌํจ)์ ๋ชจ๋ ํฌํจํฉ๋๋ค. , ์์ฐ์ ๋ฑ) ์ด๋ฌํ ์งํฉ์ ๋ํด ์ ์๋ ๋ชจ๋ ํฉ์งํฉ, ๊ต์งํฉ, ์นด๋๋๋ฆฌํฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ชจ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ 5๋ ํ์ฒ๋ผ ๋ค๋ฆฐ๋ค. ํ๋ฃจ ๋ง์ ๊ตฌํํ ์ ์๋ ๊ฐ๋จํ ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง๋ ์์ 1000๋ฐฐ ๋ ํฐ ์์ง ์ง์ ๋์ง ์์ ๊ธฐ๋ฅ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ทธ๊ฒ์ ๋์๊ฒ 5๋ ํ์ฒ๋ผ ๋ค๋ฆฐ๋ค. ํ๋ฃจ ๋ง์ ๊ตฌํํ ์ ์๋ ๊ฐ๋จํ ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง๋ ์์ 1000๋ฐฐ ๋ ํฐ ์์ง ์ง์ ๋์ง ์์ ๊ธฐ๋ฅ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ๋จ์ง IReadOnlySet<T>
์ ๋ํ ์ง์ ์ด ์๋ ๊ฒ์ ์๋ตํ๊ณ ์์ต๋๋ค - ์ด ๋ฌธ์ ๋ ์ด๋ฏธ 4๋
ํ์ ๊ณต๊ฐ๋์์ต๋๋ค.
๋ง์ดํฌ๋ก์ํํธ ๋ฐฉ์: ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ ์ฉํ ๊ฒ์ ์์ญ ๋ ์ด ๊ฑธ๋ฆฝ๋๋ค. ์ ์ ์ด ๋ฒ์ฉ ๋ ๋ค. 5๋ ๊ณผ ๊ณ์ฐ.
๋ ์๊ธด๊ฑด ์ฌ๊ธฐ๋ ์์
https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.management.sdk.sfc.ireadonlyset-1
@terrajobst ์๊ฐ?
ISet<T>
IReadOnlySet<T>
ISet<T>
ํ์ฅํ ์ ์์ต๋๋ค(๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์ ๋ํด ํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก). ๋์ค์ ReadOnlySet<T>
๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. IReadOnlySet<T>
๊ฐ ISet<T>
์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ API๋ฅผ ๋บ ๊ฐ์ธ์ง ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค.ImmutableSortedSet<T>
๋ฐ ImmutableHashSet<T>
(๋ฐ ํด๋น ๋น๋)์ IReadOnlySet<T>
๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.ISet<T>
์ ๋ค๋ฅธ ๊ตฌํ์ ๊ฒ์ํด์ผ ํฉ๋๋ค. namespace System.Collections.Generic {
+ public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+ bool Contains(T value);
+ bool IsProperSubsetOf(IEnumerable<T> other);
+ bool IsProperSupersetOf(IEnumerable<T> other);
+ bool IsSubsetOf(IEnumerable<T> other);
+ bool IsSupersetOf(IEnumerable<T> other);
+ bool Overlaps(IEnumerable<T> other);
+ bool SetEquals(IEnumerable<T> other);
+ }
- public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
- public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
}
ํด๋ด, ๊ฐํ!
@terrajobst
์ฐ๋ฆฌ๋
ISet<T>
IReadOnlySet<T>
ISet<T>
ํ์ฅํ ์ ์์ต๋๋ค(๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์ ๋ํด ํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก).
๊ธฐ๋ณธ ์ธํฐํ์ด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ ์ด๊ฒ์ด ์ฌ์ ํ ์ฌ์ค์ ๋๊น? https://github.com/dotnet/corefx/issues/41409 ๋ฅผ ๋ซ์์ผ ํ๋ค๋ ๋ป์ธ๊ฐ์?
@terrajobst
์ฐ๋ฆฌ๋
ISet<T>
IReadOnlySet<T>
ISet<T>
ํ์ฅํ ์ ์์ต๋๋ค(๋ค๋ฅธ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์ ๋ํด ํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก).๊ธฐ๋ณธ ์ธํฐํ์ด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ ์ด๊ฒ์ด ์ฌ์ ํ ์ฌ์ค์ ๋๊น? dotnet/corefx#41409๋ฅผ ๋ซ์์ผ ํ๋ค๋ ๋ป์ธ๊ฐ์?
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ ผ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ DIM ์ด ์๋
@terrajobst / @danmosemsft ๋๊ตฌ์๊ฒ ํ ๋น๋์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๋ฌ์ฑํ๊ณ ์ ํ๋ ์์
์ ๋ช
ํํ ํ๊ธฐ ์ํด @terrajobst ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
```
IReadOnlySet๋ ๊ตฌํํด์ผ ํฉ๋๋ค.
ISet์ ๋ค๋ฅธ ๊ตฌํ์ ๊ฒ์ํด์ผ ํฉ๋๋ค.
````
HashSet, SortedSet์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ.
์ค์บํ๋ ๊ฒ์ ๋ฌด์์ด๋ ์ฐพ๊ณ ์์ฌ์ค๋ฌ์ด ๊ฒ ๊ฐ์ผ๋ฉด ๊ฐ์ ธ์ต๋๋ค.
์ด๊ฒ์ด ์ฌ์ ํ ์กํ ์ ์๋ค๋ฉด ๋๋ ๊ด์ฌ์ ๊ฐ์ง ๊ฒ์ ๋๋ค.
@Jlalond ์๋, ๋น์ ์๊ฒ ํ ๋น๋์์ต๋๋ค. ์ ์ ๊ณ ๋ง์.
@danmosemsft @terrajobst
๊ทธ๋ฅ ์
๋ฐ์ดํธ์
๋๋ค. ์ ๋ ์ด ์์
์ ํ๊ณ ์์ผ๋ฉฐ, ๊ฐ์ธ์ฉ ์ฝ์ด Lib์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๋ง์ง๋ง ์ง๋ฌธ Dan, ์ด๊ฒ์ ์ํด Mono๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๊น? corefx๊ฐ ๋๋๊ณ ๋ชจ๋ ธ๊ฐ ์์๋๋ ์์น์ ๋ํด ํต์ฐฐ๋ ฅ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋ง์ฝ ๋น์ ์ด ๊ทธ๊ฒ์ด ๋๋ฅผ ๋ ๋ฆฝ์ ์ธ ์ฐ๊ตฌ๋ก๋ถํฐ ๊ตฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ค๋ฉด
@Jlalond Mono๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. Mono ๋ฐํ์์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ด๋ํ๋ ์ด์ ์ค ํ๋๋ CoreCLR ๋๋ Mono ๋ฐํ์๊ณผ ๋์ผํ ์ ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํจ์
๋๋ค. ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ค์๊ณผ ๊ฐ์ด ์์ ๋ถ๋ถ๋ง ๋ค๋ฆ
๋๋ค.
coreclrsrcSystem.Private.CoreLib ๋ mononetcoreSystem.Private.CoreLib. (๋๋ถ๋ถ์ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ librarySystem.Private.CoreLib ์ธ๋ถ์์ ๊ณต์ ๋ฉ๋๋ค). ๊ทธ๋์ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ง์ง์ง ์๋ ํ - ๋น์ ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
@danmosemsft ์ค๋ช
์ด๋ด @danmosemsft ๋ ์ด๊ฒ์ ๋ํด ํ์ ์กฐ์น๋ฅผ
์ฃผ์ #32488
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ์๋ API ๋์์ธ:
์ด๊ฒ์
ISet<>
API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค(๋ณ์ด ๋ฐฉ๋ฒ์ ์ ์ธ).Comparer
๊ฐ ์ด๊ฒ์ ๋ง์ง ์๋ ๊ฒ์ ์ ๊ฐ์ด์ง๋งISet<>
๋IReadOnlyDictionary<>
๋น๊ต์๋ฅผ ๋ ธ์ถํ์ง ์์ผ๋ฏ๋ก ์ง๊ธ ์์ ํ๊ธฐ์๋ ๋๋ฌด ๋ฆ์์ต๋๋ค.