IReadOnlyList
ãè¿œå ãããŠãããã»ãããšãªã¹ãéã®ããªãã£ãäœäžããŸããã ãããå確ç«ããã®ã¯çŽ æŽãããããšã§ãã
ããã䜿çšãããšãå®è£ ã«ãšããããªãèšãæ¹ã«ãªããŸãããããã¯ãã¢ã€ãã ãäžæã§ãããã®èªã¿åãå°çšã®ã³ã¬ã¯ã·ã§ã³ã§ããã
æããã«ããã¯å€ãã®äººã ã«ãã£ãŠå¿ èŠãšãããŠããŸãïŒ
SQL ServerïŒ https ïŒ
RoslynïŒ https ïŒ
ã³ã¡ã³ãã®äžéšã®ç·ïŒ http ïŒ
èŸæžã®ããŒã³ã¬ã¯ã·ã§ã³ãèªã¿åãå°çšã®ã»ããæäœã«äœ¿çšããããšããçŸå®ã®åé¡ã«åãçµãã§ãããšãã«ããã®è°è«ãèŠã€ããŸããã ãã®å ŽåããµããŒãããããã«ãããã«ç§ãææ¡ããAPIããããŸãã
namespace System.Collections.Generic {
+ public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+ bool Contains(T value);
+ bool IsProperSubsetOf(IEnumerable<T> other);
+ bool IsProperSupersetOf(IEnumerable<T> other);
+ bool IsSubsetOf(IEnumerable<T> other);
+ bool IsSupersetOf(IEnumerable<T> other);
+ bool Overlaps(IEnumerable<T> other);
+ bool SetEquals(IEnumerable<T> other);
+ }
- public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
- public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
+ public class ReadOnlySet<T> : ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+ public int Count { get; }
+ public ReadOnlySet(ISet<T> set);
+ public bool Contains(T value);
+ public bool IsProperSubsetOf(IEnumerable<T> other);
+ public bool IsProperSupersetOf(IEnumerable<T> other);
+ public bool IsSubsetOf(IEnumerable<T> other);
+ public bool IsSupersetOf(IEnumerable<T> other);
+ public bool Overlaps(IEnumerable<T> other);
+ public bool SetEquals(IEnumerable<T> other);
+ }
public class Dictionary<TKey, TValue> {
- public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+ public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey>, IReadOnlySet<TKey> {
+ public bool IsProperSubsetOf(IEnumerable<TKey> other);
+ public bool IsProperSupersetOf(IEnumerable<TKey> other);
+ public bool IsSubsetOf(IEnumerable<TKey> other);
+ public bool IsSupersetOf(IEnumerable<TKey> other);
+ public bool Overlaps(IEnumerable<TKey> other);
+ public bool SetEquals(IEnumerable<TKey> other);
}
}
}
Dictionary<TKey, TValue>.KeyCollection
è¿œå ããããšã¯èš±å®¹ã§ããŸããïŒ ãã¡ããã芧ãã ãããIReadOnlySet<T>
ã SortedDictionary
ãImmutableDictionary
ãªã©ã®ä»ã®Dictionary
KeyCollection
IReadOnlySet<T>
ã«å®è£
ããå¿
èŠããããŸããïŒTryGetValue
ããã¯ãªãã§ãããŸãããISet<T>
æœåšçã«ä»ãŸã§ã«ãªããŒã¹é²æ¢ããã§ãããããã®ããã«ISet<T>
å®è£
ããããã«IReadOnlySet<T>
ãReadOnlyCollection<T>
é¡äŒŒããReadOnlySet<T>
ã¯ã©ã¹ãè¿œå ããŸãããç©äºãäžå€ã«ããããã®èšèªæ§é ãããã°ãããšæããŸãããïŒ ããããã°ããããã®éæ³ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæã€å¿ èŠã¯ãããŸããã
@whoisjã©ã®èšèªïŒ CLRã«ã¯æ°ååãããŸãã
æœåšçãªèšèªæ©èœãšããŠããã¡ã¿ããŒã¿è¡šçŸãå¿ èŠã«ãªããŸãã ãã®å ŽåãããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ïŒãŸãã¯åäœã€ã³ã¿ãŒãã§ã€ã¹ïŒã¯ä»ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšåããããåªããŠããŸãã æ°ããã¡ã¿ããŒã¿ãšã³ããªãä»ããŠã³ã¬ã¯ã·ã§ã³ã¿ã€ãã®äžå€æ§ãäŒããããšããããšã¯ãCLRãä»»æã®ã¯ã©ã¹ãå éšã§ã©ã®ããã«æ©èœãããã«ã€ããŠä»®å®ãè¡ãã¹ãã§ã¯ãªããããé©åã§ã¯ãªãããã§ãïŒCLRã«ã¯ã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ã®æŠå¿µããŸã£ãããããŸãããé åïŒã
@whoisjããã¯å°ãªããšãå°æ¥ã®CïŒããŒãžã§ã³ã®1ã€ã§èæ ®ãããŠãããšæããŸãã ãã ãããã®æ±ºå®ã¯ããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ã«ããã察称ã€ã³ã¿ãŒãã§ãŒã¹ã®å¿ èŠæ§ã«åœ±é¿ãäžããŸããã ããã«ãã³ãŒãã®å質ãšããã©ãŒãã³ã¹ã®äž¡æ¹ãéèŠããã²ãŒã ãªã©ãå¯å€ã¢ã€ãã ã®èªã¿åãå°çšãªã¹ãã圹ç«ã€ã·ããªãªãæ³åããããšãã§ããŸãã
ãŸããäžå€ã®ã³ã¬ã¯ã·ã§ã³ã¯ãã§ã«å©çšå¯èœã§ãã
https://msdn.microsoft.com/en-us/library/system.collections.immutableïŒv = vs.111ïŒ.aspx
å®å
šã«äžå€ã®ã³ã¬ã¯ã·ã§ã³ãå®çŸããã«ã¯ã immutable T
ãå®çŸ©ããããã䜿çšããŠImmutable...<T>
ã³ã¬ã¯ã·ã§ã³ã宣èšããæ¹æ³ãå¿
èŠã§ãã
@HaloFour ïŒsmirkïŒã®åã«ãã®éãthis
ïŒãã
@dsaf絶察ã«ïŒ å¥ã®åé¡ã§ã¯ãæžã蟌ã¿å¯èœãªèŠçŽ ã®èªã¿åãå°çšã³ã¬ã¯ã·ã§ã³ã®äœ¿çšãå¯èœã«ããããã«ãèªã¿åãå°çšã®æžã蟌ã¿å¯èœãªã¢ã³ãã¿ãŒã ãçšæããããšãææ¡ããŸããã readonly Bag<writable Element>
ã®ç·ã«æ²¿ã£ãäœãã
&
ã§ããŒã¯ãããåç
§ã¯ãã³ã³ãã€ã©ãŒã«ãã£ãŠäžå€ãšããŠæ±ãããããšãææ¡ããŸããã ç§ã¯ãŸã ã³ã³ãã€ã«æã®ãã§ãã¯ã ããå¿
èŠã§ãããå®è¡æã®ä¿èšŒã§ã¯ãªãããžãã¯ã®ã³ã³ãã€ã«æã®æ€èšŒãäž»ã«æ±ããŠãããããCLRèªäœã«ãã£ãŠåŒ·å¶ãããå¿
èŠããããšæããŠããŸãã ããã¯ãéçºè
ãäžå€ã§ããããšãæãã§ãããã¹ãŠã®åç
§ãã«ããŒããŸãããåŒã³åºãããšã«è¡ãããŸãã
@whoisjãããããããã¯ããªãæ¥ç·çã§ãããdsafãä»æ¥ã®ååŸã«åå²/ PRã§ãããã®ããã®ãã®èŠæ±ãã3ã€ã®ç°ãªãããŒã éã®åªåã䌎ããã®ã«å€ããŸãã
ãŸãããããã³ã³ãã€ã©ã®åé¡ãšããŠæ±ã£ãŠããŸãã ãã®æç¹ã§ã¯ãïŒJITã³ã³ãã€ã©ä»¥å€ã«ïŒã³ã³ãã€ã©ã¯é¢äžããŠãããããäžé©åãªãã³ãŒãã®å®è¡ãé²æ¢ã§ããã®ã¯æ€èšŒè
ã ãã§ãã äžå€æ§ã®æ¢åã®ã©ã³ã¿ã€ã ã¡ã«ããºã ã§ããinitonly
ãã£ãŒã«ãã§ãããæ€èšŒãã¹ããããããå ŽåïŒãŸãã¯ãªãã¬ã¯ã·ã§ã³ãä»ããŠïŒãç°¡åã«ç¡å¹ã«ãªãå¯èœæ§ããããŸãã
ç§ã¯ãCïŒèšèªãšã³ã³ãã€ã©ããçŽç²ãªãã¡ãœãããããé©åã«ãµããŒãã§ããã°çŽ æŽããããšæããŸãã å±æ§PureAttribute
ãã§ã«ååšããŸãããæ£çºçã«äœ¿çšãããŠãããå®éã«ã¯èšèªãµããŒãã¯ãããŸããã ãŸããCïŒãã³ã³ãã€ã©ãšã©ãŒïŒpureã¯pureã®ã¿ãåŒã³åºãããšãã§ãããªã©ïŒã«ãã£ãŠãµããŒãããŠãããšããŠããå¥ã®èšèªã䜿çšããããšã§ç°¡åã«ç¡å¹ã«ã§ããŸãã ãã ãããããã®ã¡ãœããã¯ãILã«ã³ã³ãã€ã«ããããšåºæ¬çã«ãã¹ãŠã®è³ããç¡å¹ã«ãªããæ¢åã®ã¢ã»ã³ããªã®å®è¡æ¹æ³ãæ²ããããšãã§ããªããããèªåèªèº«ãã¢ããŠã³ã¹ããŠåŒ·å¶ããå¿
èŠããããŸãã
@HaloFourãã§ã¢ã
ãçŽç²ãªããŸãã¯ãå®æ°ãã®åç §ããµããŒãããäžè¬çãªæ¹æ³ããªããšä»®å®ãããšãææ¡ããããã®ãæè¯ã®ä»£æ¿æ段ã§ãããšæããŸãã
ä»ããå¿ èŠãªå Žåã¯ãç§ã®Commonsã©ã€ãã©ãªïŒCommons.Collections https://github.com/yanggujun/commonsfornet/tree/master/src/Commons.Collections/SetïŒã§èªã¿åãå°çšã»ããããµããŒããããŠããŸãã ãããåºåãšæãããå Žåã管çè ã¯ãã®æçš¿ãåé€ããŠãã ãã...ç§ã®ææ¡ã¯ããã€ãã®ãªãŒãã³ãœãŒã¹ã®å®è£ ãæ¢ãåãããšã§ãã
@yanggujunææ¡ãããããšããããã¯çŽ æŽãããã©ã€ãã©ãªã®ããã§ãããäœåãªäŸåé¢ä¿ãé¿ããããã«ç§ã¯èªåèªèº«ãããŒã«
ç§ã®ææ¡ã¯ãããã€ãã®ãªãŒãã³ãœãŒã¹ã®å®è£ ãæ¢ãåãããšã§ãã
ããã¯åé¿çã§ãããIReadOnlySetã®ãããªåºæ¬çãªã€ã³ã¿ãŒãã§ã€ã¹ã¯å®éã«ã¯.NETFrameworkèªäœã®äžéšã§ããå¿ èŠããããŸãã
ããã«ã¯ãAPIã¬ãã¥ãŒã®æºåãã§ããŠãããããã®ã¹ããã¯ã¬ãããå¿ èŠã§ããïŒ
ãããŠãç§ãã¡ãããã«åãçµãã§ããéãããããReadOnlyããšã¯ç°ãªãååã«ããããšãæ€èšããŠãã ããïŒèå³æ·±ãæçš¿ãåç
§ããŠãã ããïŒhttpïŒ//stackoverflow.com/questions/15262981/why-does-listt-implement-ireadonlylistt-in-net-4- 5ïŒ
ãèªã¿ããããã¯åé¡ãªãããã§ãã
@GiottoVerducciããããäžå®å šãªå Žåã§ããäžè²«ããåœåãã¿ãŒã³ãç¶æããããšæããŸãã ãã ããæ¢åã®ã€ã³ã¿ãŒãã§ãŒã¹ã®ååãå€æŽããããã«ãå¥ã®åé¡ãèªç±ã«æèµ·ããããšãã§ããŸãã
ææ¡ãããAPIèšèšïŒ
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsProperSubsetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
}
ããã¯ISet<>
APIã«åºã¥ããŠããŸãïŒæããã«ãã¥ãŒããŒã·ã§ã³ã¡ãœãããé€ãïŒã
Comparer
ãããã«åœãŠã¯ãŸããªãã®ã¯æ®å¿µã§ããã ISet<>
ãIReadOnlyDictionary<>
æ¯èŒå¯Ÿè±¡ãå
¬éããŠããªããããä»ããä¿®æ£ããã«ã¯é
ãããŸãã
bool Contains(T item);
ICollection<T>
ã¯Contains(T item)
ãããã®ã§ãããIReadOnlyCollection<T>
代ããã«
äžå€ã®ã³ã¬ã¯ã·ã§ã³ããã±ãŒãžã¯ããŸã ããŒã¿çã§ããéãnugetãããªã¹ãããå€ãããŸããã
ããã¯ããªãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ãããæšæºã®ã©ã€ãã©ãªã§åŠçããå¿
èŠããããšæããŸãã
ã¿ã°ã瀺ãããã«ãããã§APIã«å¯ŸããŠè¡ãã¹ãäœæ¥ã¯ä»ã«ããããŸããïŒ ããã圹ã«ç«ã¡ã誰ããäœãå¿ èŠããææããããšãã§ããã°ãç§ã¯ããã«å°ãæéãè²»ãããŠããããã§ãã
ææ¡ãããAPI @ ashmindã¯çŽ æŽãããèŠããŸãã
ISet<T>
ã«IReadOnlySet<T>
ãæ¡åŒµãããããšã¯ã§ããŸããïŒ ããã¯èµ·ãããŸããIList<T>
/ IReadOnlyList<T>
ïŒ
ããã§ãªãå Žåã¯ãèæ
®ãã¹ãä»ã®å€æŽã¯ã HashSet<T>
ã SortedSet<T>
ãããã³ããããå«ãcorefxã®ãã¹ãŠã®ISet<T>
å®è£
ã®ã€ã³ã¿ãŒãã§ã€ã¹ãªã¹ãã«IReadOnlySet<T>
ãè¿œå ããããšã ãšæããŸãã System.Collections.Immutable
äžå€ã®å¯Ÿå¿ç©ã
@GiottoVerducciã«åæããIReadOnlySet<T>
ãããªååã䜿çšããŠããã³ã³ãã©ã¯ãæ©èœã¯å®£èšãããŸãããã³ã³ãã©ã¯ãã®å¶éã宣èšãããŸãã 次ã«ããããã®å¶éãšççŸããå¥ã®å¥çŽãšçµã¿åãããŠåãå¥çŽã䜿çšããããšã¯æ··ä¹±ãæããŸãã å¥çŽåã¯ãå®è£
è
ããµããŒããããã®ã«é¢ããè¯å®çãªäž»åŒµã説æããå¿
èŠããããšæããŸãã 確ãã«ã IReadableSet<T>
ãããªååã¯çŽ æŽããããã®ã§ã¯ãããŸããããå°ãªããšãå®è£
è
ãäœããããããããã説æããŠããŸãã
@HaloFourååçã«åæããŸããã IReadOnlyList<T>
ã§ãåãç¶æ³ã«ãªããŸããã äžè²«æ§ãç¶æããããšã¯ãããã§ã®ç²ŸåºŠã®åäžãããéèŠã§ããIMHOã
@drewnoakes
ç§ã¯ç解ããŠããŸãããããŠäžè²«æ§ãéèŠã§ãã ããããããã¯ISet<T>
ãIReadOnlySet<T>
æ¡åŒµãã¹ãã§ã¯ãªãçç±ã«ãçãããšæããŸãã
äžè²«æ§ãç¶æããããšã¯ãããã§ã®ç²ŸåºŠã®åäžãããéèŠã§ããIMHOã
ããããããã¯
ISet<T>
ãIReadOnlySet<T>
æ¡åŒµãã¹ãã§ã¯ãªãçç±ã«ãçãããšæããŸãã
ç§ã¯ããªããèŠç¹ãéããŠãããšæããŸãã ããªãã¡ããã®çç±ã§ãIList<T>
ã ICollection<T>
ã IDictionary<TKey, TValue>
ãä»ã«ãã¹ãã§ããISet<T>
ããŸããèªåãå°çšãã¥ãŒã€ã³ã¿ãã§ãŒã¹ãå®è£
ããããã«åºå®ãããŸãã ããããªããšãBCLã®çŽæçã§ãªãèšèšãåé¿ãããšãã«ã誰ããããããŸãã
@binki
ç§ã¯åæããŸããã ããã«ã€ããŠç§ãæ°ã«å ¥ããªãã®ã¯ãèªã¿åãå°çšã®åäœãèŠå®ããã³ã³ãã©ã¯ãããèªã¿åãå°çšã®åäœãèŠå®ããã³ã³ãã©ã¯ãã«ãã£ãŠæ¡åŒµãããããšã§ãã ååãééã£ãŠããŠãæ§æãééã£ãŠããŸãã ããããããã«ãããŸãã äž¡æ¹ãå€æŽããããã«æ祚ãããã®ã§ããããããããŒãã«ã«ãããšã¯æããŸããã
@HaloFour
äœããžã®ã€ã³ã¿ãŒãã§ãŒã¹ãååŸãããšããããã¯äœããžã®_ãã¥ãŒ_ã§ãã ãã¥ãŒèªäœã¯èªã¿åãå°çšã§ãã ã¿ã€ãã»ãŒããªã³ãŒããèšè¿°ããã¢ãããã£ã¹ããåé¿ããªããšä»®å®ãããšãèªã¿åãå°çšã®ã³ãŒããåãåã£ãå Žåãããã¯ãã¹ãŠã®ç®çãšç®çã«ãããŠãèªã¿åãå°çšã§ãã ããã¯ãããŒã¿ãå€æŽãããªãããšãä¿èšŒãããã®ã§ã¯ãããŸããã ããã¯ããã¡ã€ã«ãèªã¿åãå°çšã§éãã®ãšåãã§ãã èªã¿åãå°çšã§éããããã¡ã€ã«ã¯ãå¥ã®ããã»ã¹ã«ãã£ãŠå€æŽã§ããŸãã ãŸãã¯ã管çè ãããŒã¿ã®èªã¿åã/æžã蟌ã¿ãã¥ãŒãæã¡ãèªåã®äžããããŒã¿ãå€æŽã§ããWebãµã€ãäžã®ããŒãžãžã®èªã¿åãå°çšã¢ã¯ã»ã¹ã®ããã«ã
ããã§èªã¿åãå°çšãééã£ãçšèªãšèŠãªãããçç±ãããããŸããã èªã¿åãå°çšã¯ãäžå€ãæå³ããŸããã å¿ èŠã«å¿ããŠãnugetããã±ãŒãžå šäœ/ããŸããŸãªAPIïŒè¿œå /åé€ã«ãã£ãŠæ°ãããªããžã§ã¯ããçæãããçŸåšã®ã€ã³ã¹ã¿ã³ã¹ãå€æŽãããªãããšãä¿èšŒãããŠãããããäžå€ã§ããïŒããããŸãã
ç§ã¯äŒŒããããªããšãèããŠããŸããã .NETã®ãèªã¿åãå°çšãã¯ããã£ãŒã«ãã«å¯ŸããŠãããªã匱ãä¿èšŒã§ãã ããçŽããèãããšãããã¯ãã¹ãŠãã£ãšçã«ããªã£ãŠãããšç¢ºä¿¡ããŠããŸãã ä»ã®ãšãããå®çšçã§ãã䟡å€ããããŸãã
ãããã£ãŠãäžè¬ã«ãã¡ãœãããIReadOnlySomething<T>
ãåãå
¥ããå Žåãäžè¬ã«ãã¡ãœããã¯ãããå€æŽããªããšæ³å®ã§ããŸãã åä¿¡ã¡ãœãããåç
§ãã¢ãããã£ã¹ãããªããšããä¿èšŒã¯ãããŸããããŸããã¢ã¯ã»ã¹æã«ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãå
éšçã«å€æŽãããªããšããä¿èšŒããããŸããã
C ++ã§ã¯ã const_cast
ã¯const
ã®ä¿èšŒã匱ããŸããããã¯æ®å¿µã§ããïŒç¹ã«æè¿ã§ã¯mutable
修食åã䜿çšïŒãå®éã«ã¯ãã®æçšæ§ãæãªãããããšã¯ãããŸããã const
ã¯æ©èœãšããŠã§ãã ããªãã¯èªåãäœãæ±ã£ãŠããã®ããç¥ãå¿
èŠããããŸãã
@binkiã¯è¯ãåºå¥ãããŸãã ååã®_Immutable_ã¯ãé¢ä¿ãããã¹ãŠã®äººã®é·æã«ãããå®å®æ§ã®ããŒãä¿èšŒãæå³ããŸãã
IList<T>
ãIReadOnlyList<T>
æ¡åŒµããªãçç±ã«ã€ããŠä¿¡é Œã§ããæ
å ±æºãæã£ãŠãã人ã¯ããŸããïŒ
@binki
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã¥ãŒã§ã¯ãªããã³ã³ãã©ã¯ãã§ãã ãã®å¥çŽã¯ãå®è£
è
ã®èœåã宣èšããŸãã å®è£
è
ãå®éã«ãããã®æ©èœãå®è£
ããŠããªãå Žåã¯ãå¥çŽéåãšèŠãªããŸãã ãã®List<T>
ã¯ã©ã¹ã¯ãããããis-aã IReadOnlyList<T>
ã§ãããšäž»åŒµããŠããŸãããããã§ã¯ãããŸããã ããã¯ãã®èœåãæ¬ ããŠããŸãã
ãã®ããŒãã«ã€ããŠã¯ãè€æ°ã®èãæ¹ããããŸãã ç§ã¯æããã«ãã€ã³ã¿ãŒãã§ãŒã¹ã®ç¶æ¿ãã¿ã€ãéã®ãis-aãé¢ä¿ã«å³å¯ã«åŸãåŠæ ¡ã«å±ããŠããŸãã ç§ã¯ç¢ºãã«ã€ã³ã¿ãŒãã§ãŒã¹ã䜿ã£ãæ§æãžã®ãããã现ããã¢ãããŒãããµããŒãããŠããã List<T>
ãšãã®èŠªæã¯ã3ã4åã®è¿œå ã€ã³ã¿ãŒãã§ãŒã¹ïŒèªã¿åããæžã蟌ã¿ãè¿œå ãªã©ïŒãå®è£
ããããšã§ããããæ©æµãåãããšæããŸããã€ã³ã¿ãŒãã§ã€ã¹ã®ååã¯ãã¿ã€ããå®è¡ã§ããªãããšã§ã¯ãªããå®è¡ã§ããããšã説æããå¿
èŠããããŸãã ãã¬ãã£ãã±ã€ãããªãã£ã¢ãµãŒã·ã§ã³ã¯ãå¥çŽã«ã¯ããŸãæå³ããããŸããã
@drewnoakes
ä»ã®ãšãããå®çšçã§ãã䟡å€ããããŸãã
åæããŸãã ç§ãã¡ã¯ä»ãããšããã§ãã IList<T>
ãå€æŽããŠIReadOnlyList<T>
ãæ¡åŒµããå Žåã ISet<T>
ãå€æŽããŠIReadOnlySet<T>
ãªã©ãæ¡åŒµããããšã¯çã«ããªã£ãŠããŸãã
IReadableX<T>
ã IWritableX<T>
ãªã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ãIReadOnlyX<T>
ãšå
±åãããã«ã¯åé·ãããŸããïŒ
IList<T>
ãIReadOnlyList<T>
æ¡åŒµããªãçç±ã«ã€ããŠä¿¡é Œã§ããæ å ±æºãæã£ãŠãã人ã¯ããŸããïŒ
ã©ããããå€ã.netãã¬ãŒã ã¯ãŒã¯ã«å¯ŸããŠã³ã³ãã€ã«ãããã¢ã»ã³ããªãããŒããããšãã®ABIãç Žãå€æŽã«ãªãã§ãããã IList<T>
ãæããªãBCLã«å¯ŸããŠIList<T>
å®è£
ããã¯ã©ã¹ãã³ã³ãã€ã«ããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšãã«ããœãŒã¹ã³ãŒããæé»çãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ã«äŸåããŠããå Žåãã»ãšãã©ã®ã³ã³ãã€ã©ã¯æ瀺çãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ãèªåçã«çæããããã§ãã IReadOnlyList<T>
å®è£
ãããšãã³ã³ãã€ã©ã¯æ瀺çãªIReadOnlyList<T>
å®è£
ãèªåçã«äœæããŸããã ç§ããã®æš©å©ãèªãã§ããå ŽåïŒ http ïŒ
@HaloFour List<>
ãšHashSet<>
ã¯ICollection<>
ãšIReadOnlyCollection<>
å®è£
ããŠããã®ã§ã IReadOnly
ãã¢ã¯ã»ã¹ãåç
§ãã容éã ããã«åºã¥ããŠã IAnything
IReadOnlyAnything
ãæ¡åŒµãããããšã¯å®å
šã«çã«ããªã£ãŠããŸãã IReadable
ãIReadOnly
ãããåªããŠããããšã«åæããŸããããã®æç¹ã§ã誰ããIReadOnly
ãã_mean_ IReadable
ãç解ãããã®ããã«äœ¿çšããŠããŸãã å®éãç§ã¯èªåã®ã³ãŒãããŒã¹ã§æå³çã«ãããæ°žç¶ãããŠããŸãããªããªããç©äºã«ã€ããŠ2ã€ã®èãæ¹ãæã€ããšã¯ãç§ã®æèŠã§ã¯äœãããèªç¥çè² è·ã倧ããããã§ãã
ååã«ãã ãã£ãŠããŸããããã®èåŸã«ããæŠå¿µã¯ååã«åŒ·åãªã®ã§ãå
·äœçãªã¯ã©ã¹ã®å Žåãšåãããã«ããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã§IReadOnly
ãæ¡åŒµã§ããããšãå¿ããé¡ã£ãŠããŸãã
@ashmindã©ã®æ¹æ³ãæ¯èŒå¯Ÿè±¡ããšããªãã®ã¯å®ç§ã ãšæããŸãã ã»ãããèŸæžã§ã¯ãæ¯èŒåã¯ãªããžã§ã¯ãå
šäœã®æ§é ã決å®ãããããç°¡åã«äº€æã§ãããã®ã§ã¯ãããŸããã ãŸããæ¯èŒåãCaseInsensitiveStringCollection
ãŸãã¯ç¹å®ã®æ¯èŒãæå³ããã³ã¬ã¯ã·ã§ã³ã«æž¡ãããšã¯æå³ããããŸããã
ïŒãã§ã«å©çšå¯èœãªæ¡åŒµã¡ãœãããããå¹ççã«Contains(T, IEqualityComparer<T>)
å®è£
ããå¥åŠãªã³ã¬ã¯ã·ã§ã³ã®å Žåãããã¯ãããã1åéãã®ã¯ã©ã¹ã¡ãœããã§ãã Contains(T, IEqualityComparer<T>)
ãäžè¬çã§ãããšã¯æ³åããããã§ããå°çšã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ãã©ãçãã«ã¯ååã§ãããããã§ããããèµ·ããã®ãæ¢ãããã®ã¯äœããããŸãããïŒ
@ jnm2
ã©ã®æ¹æ³ãæ¯èŒå¯Ÿè±¡ããšããªãã®ã¯å®ç§ã ãšæããŸãã
æ確ã«ããããã«ãç§ã¯ãããæ¯èŒå¯Ÿè±¡ãå ¬éããã¹ãã§ãããæ¯èŒå¯Ÿè±¡ãååŸããã¹ãã§ã¯ãªããšèšãããã£ãã®ã§ãã ãã¹ãŠã®ã»ãããŸãã¯ãã£ã¯ã·ã§ããªã«ã¯äœããã®çåŒã¢ã«ãŽãªãºã ãå¿ èŠã§ãããããããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§å ¬éãããŠããå¯èœæ§ããããŸãã ããããä»ã®ãšããããã®ãŠãŒã¹ã±ãŒã¹ãèŠããŠããŸãããå€éšããæäŸããããã®ãšåãæ¯èŒåã䜿çšããŠã»ãããäœæãããããªãã®ã§ãã
ãã®è°è«ã¯å€ãã®èå³æ·±ãç¹ããããããŸããããã®ã¹ã¬ãããéå§ããåçŽã§æçœãªææ¡ããã¯ã»ã©é ãããã§ãã ãããŠãç§ã¯ãã®åé¡ã解決ãããããšãæ¬åœã«æãã§ããã®ã§ãããã¯èœèããŠããŸãã
OPãè¿°ã¹ãããã«ãIReadOnlySetãªãã§IReadOnlyListãè¿œå ããããšãã«ã³ã¬ã¯ã·ã§ã³ã¿ã€ãéã®ããªãã£ãç¶æã§ããªãããšã¯æ®å¿µã§ãããå€ãã®äººãåé¿çãšããŠç¬èªã®ããŒãžã§ã³ã®IReadOnlySetã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŠããŸãïŒç§èªèº«ã®ããŒã ã«ãåæ§ã®åé¿çããããŸãïŒã corefxã¯ã©ã¹ã¯ããããå®è£ ã§ããªãããããããã®åé¿çã€ã³ã¿ãŒãã§ã€ã¹ã¯çæ³çã§ã¯ãããŸããã ããããã¬ãŒã ã¯ãŒã¯ã§ãããæäŸããäž»ãªçç±ã§ããHashSetãããå Žåã¯ããã§ã«æã£ãŠãããªããžã§ã¯ããã³ããŒãããã©ãããããããã«ãIReadOnlySetãšããŠäœ¿çšã§ããããã«ããããšèããŠããŸãã ããã©ãŒãã³ã¹ã®ããã«ã¯ãå°ãªããšããããæãŸããããšããããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®ååã¯æããã«IReadOnlySetã§ããå¿ èŠããããŸãã äžè²«æ§ã¯ãIReadOnlyXXXåã«é¢ããæžå¿µãããåªå ãããŸãã ãã®è¹ã¯åºèªããã
æ¢åã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒIReadOnlyCollectionïŒã¯å€æŽã§ããŸããã .NETã®ããã¯ã³ã³ãããèŠä»¶ã§ã¯ããã®ãããªå€æŽã¯èš±å¯ãããŠããŸããã æ¯èŒè ãæ¢åã®IReadOnlyXXXã€ã³ã¿ãŒãã§ãŒã¹ã§å ¬éãããŠããªãã®ã¯æ®å¿µã§ããïŒç§ãããã«ééããŸããïŒãè¹ã¯åã³åºèªããŸããã
å®çšçãªèŠ³ç¹ããæ®ã£ãŠãããšæãããå¯äžã®è³ªåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®ããã2ã€ã®æœåšçãªå®çŸ©ã®éã§ãã
以åã«@ashmindã«ãã£ãŠææ¡ãã
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsProperSubsetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
}
æå°éã®ææ¡ïŒ
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
}
å人çã«ã¯ãä»ã®æ¹æ³ãå°ãåºãããšãã§ããã®ã§ããã®æå°éã®ææ¡ã奜ã¿ãŸãã çæ³çã«ã¯ãIReadOnlySetã€ã³ã¿ãŒãã§ã€ã¹ãä»ããæ¡åŒµã¡ãœãããšããŠãããã®æšæºå®è£ ããããããIReadOnlySetã®å®è£ è ã¯ããããæäŸããå¿ èŠã¯ãããŸããã ãŸãããã®æå°éã®ææ¡ã¯ãä»ã®æå°éã®IReadOnlyXXXã€ã³ã¿ãŒãã§ã€ã¹ãšããäžèŽããŠãããšæããŠããŸãã
@ aaron-meyersç§ãæ±ãå¯äžã®æžå¿µã¯ã IsSubsetOf
ãšãã®å人ãContains
ãã_å¹ççãªæ¹æ³ã§æŽŸçã§ããªãããšã§ãã ããšãã°ã2ã€ã®ããã·ã¥ããŒãã«ã®å Žåã Contains
ã«äŸåãããšãå®è£
ã¯ããã·ã¥ãããã³ã°ã§ã¯ãªããã¹ããããã«ãŒãã䜿çšããããã«ãªããŸãã
ããããæ°ããã€ã³ã¿ãŒãã§ãŒã¹ã IComparableSet<T>
ã«ã¯setæäœãå«ãŸããŠããå¯èœæ§ããããŸãã
ããã€ãã®ã»ããæäœã®ããã«ã IEnumerable<T>
ã«ãã§ã«æ¡åŒµã¡ãœããããããŸãã
@ jnm2 HashSetã§å®è£ ã«ã¯ã Containsãšä»ã®ã³ã¬ã¯ã·ã§ã³ïŒIReadOnlySetãIReadOnlyCollectionãç¶æ¿ããããšã§ååŸããã³ã¬ã¯ã·ã§ã³ïŒã®åæã®ã¿ãå¿ èŠã§ãã ãã ããä»ã®ã»ãããåãæ¯èŒåã䜿çšããŠããããšãç¥ã£ãŠããå¿ èŠããããŸãã ããããããããã®æäœãæ¡åŒµã¡ãœããã§å¹ççã«å®è£ ã§ããããã«ãComparerããããã£ãIReadOnlySetã«è¿œå ãã䟡å€ããããŸãã IReadOnlyDictionaryãKeyComparerãå ¬éããªãã®ã¯æ®å¿µã§ãããå®å šã«äžè²«ããŠããããã§ã¯ãããŸãããããããIReadOnlySetã«è¿œå ãã䟡å€ããããããããŸããã ããã§èª¬æããããã«ãããããIReadOnlyDictionaryã«å«ããã¹ãã ã£ãã®ã«ã¯ååãªçç±ããããŸãã
å€æŽãããææ¡ã¯æ¬¡ã®ããã«ãªããŸãã
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
IEqualityComparer<T> Comparer { get; }
bool Contains(T item);
}
ãããã¯ãComparerãå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é
眮ããsetæäœã®æ¡åŒµã¡ãœããã®å®è£
ã§ã¯ãäž¡æ¹ã®ãªããžã§ã¯ããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããåãComparerã䜿çšããŠããå Žåã«ã®ã¿ãå¹ççãªã«ãŒãã䜿çšããŸãã åãã¢ãããŒããIReadOnlyDictionaryã«é©çšã§ããŸãïŒå®éãããããåãã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠããã ãã§ãïŒã ISetComparableã®ãããªãã®ã ãŸãã¯ã @ drewnoakesããæç»ãããšãIComparableSetãååšããå¯èœæ§ããããŸã
public interface IComparableSet<T> : IReadOnlySet<T> {
IEqualityComparer<T> Comparer { get; }
}
ãã®å ŽåãIReadOnlySetã¯Containsã®å®çŸ©ã«æ»ããŸãã
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
}
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
}
public interface IReadOnlySetEx<T> : IReadOnlySet<T> {
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsProperSubsetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
IEqualityComparer<T> Comparer { get; }
}
public class HashSet<T>: IReadOnlySetEx<T>, ISet<T>
{
// Improved implementation here.
}
public static class CollectionExtensiosn
{
public static IEqualityComparer<T> GetComparer<T>(this IReadOnlySet<T> @set)
{
var setEx = <strong i="5">@set</strong> as IReadOnlySetEx<T>;
if (setEx == null)
{
throw new ArgumentException("set should implement IReadOnlySetEx<T> for this method.")
}
return setEx.Comparer;
}
public static bool IsSubsetOf<T>(this IReadOnlySet<T> <strong i="6">@set</strong>, IEnumerable<T> other)
{
var setEx = <strong i="7">@set</strong> as IReadOnlySetEx<T>;
if (setEx != null)
{
return setEx.IsSubsetOf(other);
}
// Non optimal implementation here.
}
// The same approach for dictionary.
public static IEqualityComparer<T> GetKeyComparer<T>(this IReadOnlyDictionary<T> dictionary)
{
var dictionaryEx = set as IReadOnlyDictionaryEx<T>;
if (dictionaryEx == null)
{
throw new ArgumentException("dictionary should implement IReadDictionaryEx<T> for this method.")
}
return dictionaryEx.KeyComparer;
}
}
ãã®ã¢ãããŒãã䜿çšã§ããŸãã
䜿çšæ³ã¯æ¬¡ã®ããã«ãªããŸãã
IReadOnlySet<string> mySet = new HashSet<string>();
bool test = mySet.IsSubsetOf(new []{"some", "strings", "set"}); // Extension method
var = mySet.GetComparer(); // Extension method
å€ãã®èŠä»¶ãæºããããIReadOnlySet
/// <summary>
/// Readable set abstracton. Allows fast contains method, also shows that collection items are unique by some criteria.
/// </summary>
/// <remarks>
/// Proposal for this abstraction is discussed here https://github.com/dotnet/corefx/issues/1973.
/// </remarks>
/// <typeparam name="T">The type of elements in the set.</typeparam>
public interface IReadOnlySet<out T> : IReadOnlyCollection<T>
{
/// <summary>
/// Determines whether a <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified
/// element.
/// </summary>
/// <typeparam name="TItem">The type of the provided item. This trick allows to save contravariance and save from boxing.</typeparam>
/// <returns>
/// true if the <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified element;
/// otherwise, false.
/// </returns>
/// <param name="item">The element to locate in the <see cref="T:System.Collections.Generic.HashSet`1"/> object.</param>
bool Contains<TItem>(TItem item);
}
namespace System.Collections.Generic
{
/// <summary>
/// Provides the base interface for the abstraction of sets. <br/>
/// This is full-featured readonly interface but without contravariance. See contravariant version
/// <see cref="IReadOnlySet{T}"/>.
/// </summary>
/// <typeparam name="T">The type of elements in the set.</typeparam>
public interface IReadableSet<T> : IReadOnlySet<T>
{
/// <summary>
/// Gets the <see cref="Generic.IEqualityComparer{T}"/> object that is used to determine equality for the values
/// in the set.
/// </summary>
/// <returns>
/// The <see cref="Generic.IEqualityComparer{T}"/> object that is used to determine equality for the values in the
/// set.
/// </returns>
IEqualityComparer<T> Comparer { get; }
/// <summary>
/// Determines whether a <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified
/// element.
/// </summary>
/// <returns>
/// true if the <see cref="T:System.Collections.Generic.HashSet`1"/> object contains the specified element;
/// otherwise, false.
/// </returns>
/// <param name="item">The element to locate in the <see cref="T:System.Collections.Generic.HashSet`1"/> object.</param>
bool Contains(T item);
/// <summary>
/// Determines whether the current set is a proper (strict) subset of a specified collection.
/// </summary>
/// <returns><see langword="true"/> if the current set is a proper subset of <paramref name="other"/>; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set.</param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool IsProperSubsetOf(IEnumerable<T> other);
/// <summary>Determines whether the current set is a proper (strict) superset of a specified collection.</summary>
/// <returns>true if the current set is a proper superset of <paramref name="other"/>; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set. </param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool IsProperSupersetOf(IEnumerable<T> other);
/// <summary>Determines whether a set is a subset of a specified collection.</summary>
/// <returns>true if the current set is a subset of <paramref name="other"/>; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set.</param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool IsSubsetOf(IEnumerable<T> other);
/// <summary>Determines whether the current set is a superset of a specified collection.</summary>
/// <returns>true if the current set is a superset of <paramref name="other"/>; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set.</param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool IsSupersetOf(IEnumerable<T> other);
/// <summary>Determines whether the current set overlaps with the specified collection.</summary>
/// <returns>true if the current set and <paramref name="other"/> share at least one common element; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set.</param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool Overlaps(IEnumerable<T> other);
/// <summary>Determines whether the current set and the specified collection contain the same elements.</summary>
/// <returns>true if the current set is equal to <paramref name="other"/>; otherwise, false.</returns>
/// <param name="other">The collection to compare to the current set.</param>
/// <exception cref="ArgumentNullException">
/// <paramref name="other"/> is null.
/// </exception>
bool SetEquals(IEnumerable<T> other);
}
}
ã€ã³ãžã§ã¯ã·ã§ã³ãã«ããŒãšã®ãã®å¥çŽãnugetïŒhttps://www.nuget.org/packages/ClrCoder.Collections.ReadOnlySetïŒã«å
¬éããŸããã
æ°è»œã«äœ¿çšããŠãããã§åé¡ãéä¿¡ããŠãã ããïŒ https ïŒ
ãããå°ã人æ°ã«ãªãå ŽåïŒããããæ°åã®æ¹è¯ã®åŸïŒãCoreFXããŒã ã«ãã®æ¹åãææ¡ããããšãã§ããŸãã
@terrajobstæ¢åã®ã¯ã©ã¹ã®compatãæ°ããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŠã倧äžå€«ã§ããïŒ
@safern List<T>
ã«IReadOnly
è¿œå ãããåäŸããããŸãã
ã§ã¯ã次ã®.NET FrameworkãªãªãŒã¹ãè¿œå ããäºå®ã§ããïŒ
ãã®äœåã¯ãã€çéžããã®ã§ããïŒ ã¿ã€ã ã©ã€ã³ã¯ãããŸããïŒ
https://www.nuget.org/packages/System.Collections.Immutable/
äžå€ã®ã³ã¬ã¯ã·ã§ã³ã®ãã«ã»ããïŒ
ããã£ãã ããã¯ããŸãã«ãé·ãéããã«ãããŸããã ç§ã¯ãããéåžžã«å¿ èŠãšããŠãããããããããã«ã©ã®ããã«ã¢ãããŒããããã«ã€ããŠã®æ¹æ³ãææ¡ããããšæããŸãã
ããããã¹ãŠãå ¬éãã代ããã«ïŒ
IEqualityComparer<T> Comparer { get; }
bool IsProperSubsetOf(IEnumerable<T> other);
bool IsProperSupersetOf(IEnumerable<T> other);
bool IsSubsetOf(IEnumerable<T> other);
bool IsSupersetOf(IEnumerable<T> other);
bool Overlaps(IEnumerable<T> other);
bool SetEquals(IEnumerable<T> other);
ãããŠã顧客ã«ãããã®ã¡ã³ããŒã®å®è£ ã匷å¶ããããã«ãæãéèŠãªãã®ãè¿œå ããŸãããã
public interface IReadOnlySet<out T> : IReadOnlyCollection<T>
{
bool Contains<T>(T item);
}
ãããŠãã以äžã¯äœããããŸããã ãã®ãããªå¿ èŠãããå Žåã¯ãå°æ¥ãã€ã§ãAPIãè¿œå ã§ããŸãã ãããããããåé€ããããšã¯ã§ããªãã®ã§ããã®ææ¡ã
次ã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãISet<T>
æ¡åŒµãããã€ã³ã¿ãŒãã§ã€ã¹ã®ãªã¹ãã«è¿œå ããŸãã
ããã¥ã¡ã³ããã
ISet<T>
ïŒãã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãåºæã®èŠçŽ ãšç¹å®ã®æäœãæã€ã³ã¬ã¯ã·ã§ã³ã§ããã»ãããå®è£ ããããã®ã¡ãœãããæäŸããŸãã HashSetããã³SortedSet ã³ã¬ã¯ã·ã§ã³ã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŸãã ã³ãŒããã
ISet<T>
ã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯ããã§ã«ICollection<T>
ä»ããŠå®çŸ©ãããbool Contains<T>(T item);
ã¡ãœããããããŸãã ãŸããint Count { get; }
çµç±ã§ICollection<T>
ãŸãã
ãããã£ãŠã次ã®ããã«ãªããŸãã
public interface ISet<T> : ICollection<T>, IEnumerable<T>, IEnumerable, IReadOnlySet<T>
äºçŽ°ãªå€æŽãè°è«ããããšã¯ã»ãšãã©ãªãã倧ããªã¡ãªããã
ãããå®çŸãããŸãããã ãã®ãããªãã«ãªã¯ãšã¹ããåãå ¥ããããããŒãžããããã©ãããæããŠãã ããã ããã§äœæã§ããŸãã
@karelz @terrajobst @safern @ianhays
èŸæžã®ããŒã³ã¬ã¯ã·ã§ã³ãèªã¿åãå°çšã®ã»ããæäœã«äœ¿çšããããšããçŸå®ã®åé¡ã«åãçµãã§ãããšãã«ããã®è°è«ãèŠã€ããŸããã ãã®å ŽåããµããŒãããããã«ãããã«ç§ãææ¡ããAPIããããŸãã
namespace System.Collections.Generic {
+ public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+ bool Contains(T value);
+ bool IsProperSubsetOf(IEnumerable<T> other);
+ bool IsProperSupersetOf(IEnumerable<T> other);
+ bool IsSubsetOf(IEnumerable<T> other);
+ bool IsSupersetOf(IEnumerable<T> other);
+ bool Overlaps(IEnumerable<T> other);
+ bool SetEquals(IEnumerable<T> other);
+ }
- public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
- public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
+ public class ReadOnlySet<T> : ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+ public int Count { get; }
+ public ReadOnlySet(ISet<T> set);
+ public bool Contains(T value);
+ public bool IsProperSubsetOf(IEnumerable<T> other);
+ public bool IsProperSupersetOf(IEnumerable<T> other);
+ public bool IsSubsetOf(IEnumerable<T> other);
+ public bool IsSupersetOf(IEnumerable<T> other);
+ public bool Overlaps(IEnumerable<T> other);
+ public bool SetEquals(IEnumerable<T> other);
+ }
public class Dictionary<TKey, TValue> {
- public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+ public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey>, IReadOnlySet<TKey> {
+ public bool IsProperSubsetOf(IEnumerable<TKey> other);
+ public bool IsProperSupersetOf(IEnumerable<TKey> other);
+ public bool IsSubsetOf(IEnumerable<TKey> other);
+ public bool IsSupersetOf(IEnumerable<TKey> other);
+ public bool Overlaps(IEnumerable<TKey> other);
+ public bool SetEquals(IEnumerable<TKey> other);
}
}
}
Dictionary<TKey, TValue>.KeyCollection
è¿œå ããããšã¯èš±å®¹ã§ããŸããïŒ ãã¡ããã芧ãã ãããIReadOnlySet<T>
ã SortedDictionary
ãImmutableDictionary
ãªã©ã®ä»ã®Dictionary
KeyCollection
IReadOnlySet<T>
ã«å®è£
ããå¿
èŠããããŸããïŒTryGetValue
ãããã¯ã§ãªããšããŠISet<T>
ããã®ããã«ããŠãªããŒã¹æœåšçã«ããããŸã§åŠšããISet<T>
å®è£
ããããã«IReadOnlySet<T>
ãReadOnlyCollection<T>
é¡äŒŒããReadOnlySet<T>
ã¯ã©ã¹ãè¿œå ããŸããã@TylerBrinkleyã¹ã¬ããã«APIããããŒã¶ã«ãè¿œå ããŠããããŸãã çè«çæ ¹æ ãšãŠãŒã¹ã±ãŒã¹ãè¿œå ããŠããã ããŸãããïŒ ã¬ãã¥ãŒã®æºåãã§ããŠãããšããŒã¯ããŠãAPIãšãã¹ããŒãã«æ±ºå®ãããããšãã§ããããã«ããã«ã¯ïŒ
@TylerBrinkleyã¯ãIReadOnlySetã«EqualityComparerããããã£ãå«ããããšãå¿ããªãã§ãã ãã
@dmitriyse IEqualityComparer<T>
ããããã£ã®ã¿ã®ã²ãã¿ãŒã¯ã©ã®ãããªçšéã«ãªããŸããïŒ ããªãã¯ããã§äœãããŸããïŒ
ãã£ã¯ã·ã§ããªãšã»ããã¯ãæ£ããã³ã¬ã¯ã·ã§ã³ã®è€è£œãå¯èœã«ããããã«ãEqualityComparersãå ±åããå¿
èŠããããŸãã
æ®å¿µãªãããç§ã¯ãã®åé¡ãã©ãã§è°è«ãããããå¿ããŸããã
ã¯ããŒã³ãäœæããŠããå Žåãå
·äœçãªã¿ã€ãã䜿çšããŠããŸãããïŒ ã€ã³ã¿ãŒãã§ã€ã¹ãIEqualityComparer<T>
ããµããŒãããå¿
èŠãããã®ã¯ãªãã§ããïŒ
ããšãã°ãæååãšå€§æåãšå°æåãåºå¥ããªãçåŒæ¯èŒåãèšå®ããå Žåãæ£ããEqualityComparerãæå®ããã«æ°ããHashSetãäœæãããšäŸå€ãçºçããŸãã æå®ãããã»ããã§ã©ã®EqualityComparerã䜿çšãããŠãããããããªãå ŽåããããŸãã
ã¯ããŒã³ã ãã§ã¯ãããŸããã ã¯ããã«äžè¬çãªã·ããªãªã¯ã2ã€ã®ã»ãããæ¯èŒããããšã ãšæããŸããContainsã䜿çšããŠæé©ãªæ¯èŒãå®è£ ããã«ã¯ãäž¡æ¹ãåãæ¯èŒåã䜿çšããããšãç¥ã£ãŠããå¿ èŠããããŸãã ãã®ã¹ã¬ããã«ã¯äŸããããšæããŸãã
ããã¯èšã£ãŠããIReadOnlySetã«Containsã¡ãœããã ããè¿œå ãããã®ã§ãã ã»ããæ¯èŒãäžè¬çã«å®è£ ã§ãããšäŸ¿å©ã§ãããã»ãããžã®èªã¿åãå°çšåç §ãå¿ èŠãªã»ã©äžè¬çã§ã¯ãããŸããã
iOSçšã®Outlookãå ¥æããhttps://aka.ms/o0ukef
æçš¿è
ïŒã¿ã€ã©ãŒããªã³ã¯ãªãŒ[email protected]
éä¿¡æ¥ïŒ2018幎5æ10æ¥æšææ¥6:21:52 AM
å®å
ïŒdotnet / corefx
CcïŒã¢ãŒãã³ãã€ã€ãŒãº; èšå
件åïŒReïŒ[dotnet / corefx]ã€ã³ã¿ãŒãã§ã€ã¹IReadOnlySetãè¿œå ããHashSetãSortedSetã«å®è£
ãããŠãã ããïŒïŒ1973ïŒ
ã¯ããŒã³ãäœæããŠããå Žåãå
·äœçãªã¿ã€ãã䜿çšããŠããŸãããïŒ ã€ã³ã¿ãŒãã§ã€ã¹ãIEqualityComparerããµããŒãããå¿
èŠãããã®ã¯ãªãã§ãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ããhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388051258&data=02 ïŒ
7C01ïŒ
7CïŒ
7Cc45ea16cd3034ddd69d808d5b678ff33ïŒ
7C84df9e7fe9f640afb435aaaaaaaaaaaaïŒ
7C1ïŒ
7C0ïŒ
7C636615553141417289ïŒSDATA = xRI27JtyaAwnZ2anY05oTlxmPY5AaGVlïŒ
2BRdXK2uR0ïŒ
2F8ïŒ
3DïŒ0 =äºçŽæžã¿ããŸãã¯ã¹ã¬ããããã¥ãŒãhttps://eur01.safelinks.protection.outlook.com/?url=https%3A% 2FïŒ
2Fgithub.comïŒ
2FnotificationsïŒ
2Funsubscribe-AUTHïŒ
2FAMuQLmqboBWyHweWHSUoE1YM2OrfHZZxks5txD7wgaJpZM4E9KK-ïŒããŒã¿= 0.02ïŒ
7C01ïŒ
7CïŒ
7Cc45ea16cd3034ddd69d808d5b678ff33ïŒ
7C84df9e7fe9f640afb435aaaaaaaaaaaaïŒ
7C1ïŒ
7C0ïŒ
7C636615553141417289ïŒSDATA = hLtAXEyFNVEgWike6tMwAfUVCïŒ
2BucyjXUDwoLOLDV5gkïŒ
3DïŒ= 0äºçŽã
åæããŸããã»ããå ã§æ€åºãããå¯èœæ§ã®ããéè€ã®çš®é¡ïŒå€§æåãšå°æåãåºå¥ããã倧æåãšå°æåãåºå¥ããªããªã©ïŒãå€æããå¯äžã®æ¹æ³ã¯ãæ¯èŒåãå ¬éããããšã§ãã
ããããã¹ãŠã®ã¡ãœãããDictionary<TKey, TValue>.KeyCollection
è¿œå ãããšãã³ãŒããµã€ãºã«ããªãã®ã³ã¹ããããããããç§ã®ææ¡ã¯åãå
¥ããããªããšæãå§ããŠããŸãã äžè¬çã«ã€ã³ã¹ã¿ã³ã¹åããããžã§ããªãã¯åãžã®æ°ããAPIã®è¿œå ã«ã€ããŠã¯ããã®
IReadOnlySet
æ¯èŒå¯Ÿè±¡ã眮ãããšã¯ã§ããªããšæããŸãã
SortedSet
ã¯IComparer
HashSet
åãã IEqualityComparer
HashSet
ã¯IEqualityComparer
åããŸãã
è¯ãç¹ã¯ãæ¯èŒè ã¯ãäžè¬çãªã€ã³ã¿ãŒãã§ãŒã¹ã«å±ããªãå®è£ ã®è©³çŽ°ãšèŠãªãããšãã§ããŸãã
iOSçšã®Outlookãå ¥æããhttps://aka.ms/o0ukef
æçš¿è
ïŒã³ãŒãªãŒãã«ãœã³[email protected]
éä¿¡æ¥ïŒ2018幎5æ10æ¥æšææ¥17:04:06
å®å
ïŒdotnet / corefx
CcïŒã¢ãŒãã³ãã€ã€ãŒãº; èšå
件åïŒReïŒ[dotnet / corefx]ã€ã³ã¿ãŒãã§ã€ã¹IReadOnlySetãè¿œå ããHashSetãSortedSetã«å®è£
ãããŠãã ããïŒïŒ1973ïŒ
IReadOnlySetã«æ¯èŒåãé 眮ããããšã¯ã§ããªããšæããŸãã
SortedSetã¯IComparerãåããHashSetã¯IEqualityComparerãåããŸãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ããhttps://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcorefx%2Fissues%2F1973%23issuecomment-388221165&data=02 ïŒ
7C01ïŒ
7CïŒ
7C0ef6d84125be4c450fdc08d5b6d2b70aïŒ
7C84df9e7fe9f640afb435aaaaaaaaaaaaïŒ
7C1ïŒ
7C0ïŒ
7C636615938478979295ïŒSDATA = PHkDQPiJBEIks8yNyIA7vKODMïŒ
2BkMFI4PRX4lUUBuïŒ
2Bi0ïŒ
3DïŒ0 =äºçŽæžã¿ããŸãã¯ã¹ã¬ããããã¥ãŒãhttps://eur02.safelinks.protection.outlook.com/?url=https%3A% 2FïŒ
2Fgithub.comïŒ
2FnotificationsïŒ
2Funsubscribe-AUTHïŒ
2FAMuQLu5JGLcqrpMyGWLygbCsaSQSXFgNks5txNV2gaJpZM4E9KK-ïŒããŒã¿= 0.02ïŒ
7C01ïŒ
7CïŒ
7C0ef6d84125be4c450fdc08d5b6d2b70aïŒ
7C84df9e7fe9f640afb435aaaaaaaaaaaaïŒ
7C1ïŒ
7C0ïŒ
7C636615938478979295ïŒSDATA = 9pnuMULuDu9HWb7unïŒ
2FWYq6iYdjTKFsjN7nKiToaeHkkïŒ
3DïŒ= 0äºçŽã
IUnorderedSet
ãšIOrderedSet
ã€ã³ã¿ãŒãã§ãŒã¹ãè¿œå ããããšã«IUnorderedSet
䟡å€ããããããããŸãããããããIReadOnlySet
ããã·ã¥ãçããããã¯ãããŸããã
ç§ã¯@pgolebiowskiã®ææ¡ã奜ã
c#
public interface ISetCharacteristic<in T>
{
bool Contains(T item);
}
ããã¯ãééïŒå®æ°ïŒãªã©ã®éå¯ç®éåã«ãé©ããŠããŸãã ãããšIReadOnlySet
éã§ã¯ã ICountableSet
ïŒå¥åIEnumerableSet
ïŒã IUnorderedSet
ã IOrderedSet
ãªã©ã®ä»ã®ããã€ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã«åãŸãå¯èœæ§ããããŸãã
ãã ãã IReadOnlySet
ã ãã§ãçŸåšå©çšå¯èœãªãã®ããã倧å¹
ã«æ¹åãããããšã«åæããŠãã ããã
@NickRedwoodã®+1
ãªãŒãã³ããŠ3幎以äžã«ãªããŸãã ã¢ãããŒããå€ããŠãããå®çŸããŠãã ããã @NickRedwoodã«ãã£ãŠèšåãããå€æŽãå°å ¥ãããšããã®ã¹ã¬ããã§èª¬æããŠããä»ã®ãã¹ãŠã®æ©èœåŒ·åãå¯èœã«ãªããŸãã ãã¹ãŠã®ã¢ãããŒãã¯ããã®1ã€ã®äºçŽ°ãªããšã«ã€ããŠåæããŸãã ããã§ã¯ãåºæ¬çãªãã®1ã€ã®äºçŽ°ãªããšãè¿œå ããŠããããã¹ãŠãªãã·ã§ã³ã§ããå¯èœæ§ã®ããæ¡åŒµæ©èœã«ã€ããŠå¥ã®åé¡ãäœæããŸãããã
@TylerBrinkley @safern @karelz @terrajobst
Contains
ã¡ãœããã ãã§IReadOnlySet<T>
ã€ã³ã¿ãŒãã§ãŒã¹ã«ããã»ã©ã¡ãªããããããšã¯æããŸããã ãã®æ¹æ³ã¯æçšã§ããããããã¯æ¢ã«ã«å«ãŸããŠããŸãICollection<T>
ãæã£ãŠããã€ã³ã¿ãã§ãŒã¹IsReadOnly
ããããã£ã®å€æŽæ¹æ³ãã©ããã瀺ãããšãæå³ICollection<T>
ãµããŒããããŠããŸãã ICollection<T>
ãå®è£
ãã IsReadOnly
ãtrue
è¿ãããã«ããã ãã§ãã ãµããŒããæåŸ
ãããä»ã®æ©èœã¯ãåæå¯èœãªCount
ããããã£ãšãå¶éãå€ãããªãããã«èŠããCopyTo
ã¡ãœããã ãã§ãã
ææ¡ãããIReadOnlySet<T>
ãIReadOnlyCollection<T>
åºã¥ããŠå®è£
ãããããšãéåžžã«å¬ããæããŸããããã¯ãçŸåšå©çšå¯èœãªãã®ã倧å¹
ã«æ¹åããããšã«ãªãã§ãããã ïŒ@TylerBrinkleyã¯-ããªããæå³ãããã®ãšä»®å®IReadOnlyCollection<T>
ã®ã§ã¯ãªãã ICollection<T>
ã
ç§ã¯ãã£ââãšåºæ¬çãªã€ã³ã¿ãŒãã§ãŒã¹ã®åŽã«èª€ãããããšæããŸãããããŠããSetã®ããã®ãã®ããã£ããªããããã¯Contains
ã¡ãœãããæã€åäžã¡ãœããã€ã³ã¿ãŒãã§ãŒã¹ã§ãããã ããã¯è¯ãæ°åŠçåºç€ãæã£ãŠããããšãŠããããã§ãã ããããæ¢åã®ã¯ã©ã¹ã«æ¹è£
ãããšããç§ã¯å°ãªãæ¹ãè¯ããšããåŸä»ããåãå
¥ãããããŠããã£ãå Žåã¯1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã ããããã®åŸæ¹é ããIReadOnlySet<T>
ã«åºã¥ããŠIReadOnlyCollection<T>
ãããããå¿
èŠããããŸãã
IReadOnlyCollection<>
ã¯.Contains
ããããŸãããããã¯ãå
±å€ããã®ã劚ããããã§ãã
è¯ãç¹ã§ãã以åã®æçš¿ãåå€ã«ãªãããã«ä¿®æ£ããŸããã IReadOnlySet<T>
ã¯ãã¹ã¬ããã®æ©ã段éã§æçš¿ãããã¢ãããŒãã䜿çšãããªãéããäžå€ã§ããå¿
èŠããããããã«ã€ããŠã¯ããããããŸããã
@TylerBrinkleyå人çã«ã¯ãç§ã¯IsReadOnly
ããããã£ã®ãã¡ã³ã§ã¯ãããŸãããããããå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«ãã®æ
å ±ãç¥ã£ãŠããããããšæããŸãã IReadOnlyCollection<T>
ã€ã³ã¿ãŒãã§ã€ã¹ãåç
§ããŠããå Žåã§ããã³ã¬ã¯ã·ã§ã³ãä»ããæœåšçãªå埩ã§ã¯ãªããã«ãã¯ã¢ãããé«éã«ãªãããšãçºä¿¡è
ãŸãã¯åŒã³åºãå
ãç¥ã£ãŠãããšäŸ¿å©ã ãšæããŸãã ãã»ãããã¯ãããæå³ããŸãã
Contains
ã¡ãœããã ãã§ã¯ã Set
ãäœããã¹ãããå®çŸ©ããã®ã§ã¯ãªãã Collection
ãäœããã¹ãããå®çŸ©ããŸãã ã€ãŸãã Contains
ã¯ISet
ã¡ã³ããŒã§ã¯ãªãã ISet
ç¶æ¿ããICollection
ã¡ã³ããŒã§ãã ISet
ã®ä»ã®ã¡ã³ããŒã¯ã Set
ãäœããã¹ãããå®çŸ©ããå¿
èŠããããŸãã ã»ãšãã©ã®äººãããããContains
ã¡ãœããå°çšã®ã»ããã䜿çšããŠããããšãç解ããŠããŸãããã»ããã«ã¯ããã ãã§ã¯ãããŸããã
@TylerBrinkleyãããããã®æç¹ã§IReadOnlyCollection<T>.Contains(T)
ãå®çŸ©ããããšããå¯èœã§ããïŒ ç§ã¯ããã¯æããªãã£ãã ãã®ãããå¯äžã®ãªãã·ã§ã³ã¯IReadOnlySet<T>
ãå°å
¥ããããšã§ãããå°å
¥ãããå Žåã¯ã IReadOnlySet<T>.Contains(T)
ããã®äžã§å®£èšãããŠããããšã確èªããŠãã ããã
@ jnm2ã¯èšãïŒ
IReadOnlyCollection<>
ã¯.Contains
ããããŸãããããã¯ãå ±å€ããã®ã劚ããããã§ãã
ãããä»ã®ç§ã«ãšã£ãŠæ倧ã®åé¡ã®ããã§ãã IReadOnlyCollection<T>
ãå
±å€ã§ããå Žåã IReadOnlySet<T>
ãäžå€ã§ããã®ã¯å¥åŠãªããšã§ãã å€ãã®æ¢åã®IReadOnly*
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãæžã蟌ã¿å¯èœãªã€ã³ã¿ãŒãã§ãŒã¹ãå¿
ç¶çã«äžå€ã§ããout T
ã§ããããã«æ³šææ·±ãèšèšãããããã§ãã ç§ãã¡ã®ã»ãšãã©ã¯ã IReadOnlySet<T>
ãå°ãªããšãContains(T)
ã¡ãœããã宣èšããããšãæãã§ããŸãããããã§ããããå
±å€ã«ãªãã®ãé²ããŸãã
ICollection
æ¬åœã«Contains(T)
ãå®çŸ©ããã®ã«é©åãªå Žæã§ããå Žåãããã¯å¯èœã§ããïŒ ãã¶ãIReadOnlyProbableCollection<T>.Contains(T)
ã¯äžå€ã§ã Collection<T>
ãšHashSet<T>
ã«ãã£ãŠå®è£
ãããŸããïŒ
@NickRedwoodã®ISetCharacteristic<T>
ã®ææ¡ã¯ããããããã£ãšãããã«æããŸãã ããã«ã¯ã䟿å©ãªCount
ãå®è£
ããªããšããå©ç¹ããããŸãã
å人çã«ã¯ãIsReadOnlyããããã£ã®ãã¡ã³ã§ã¯ãªãã®ã§ãå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«ãã®æ å ±ãç¥ã£ãŠããããããšæããŸãã
ãã®ç·ã¯äžæã«è©±ãã圌ã«ãã£ãšã¯ã€ã³ã泚ãã
@binki IReadOnlyCollection<T>
ã¯IReadOnlySet<T>
Contains
ã¡ãœãããå¿
èŠã§ããããšã«åæããŸãããä»ã®ãã¹ãŠã®éå€æŽISet<T>
ãèããŸãã
äžèšã®Dictionary.KeyCollection
ãŠãŒã¹ã±ãŒã¹ã®ä»ã«ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãè¿œå ããããã«ä»ã«ã©ã®ãããªãŠãŒã¹ã±ãŒã¹ãæãä»ãããšãã§ããŸããïŒ
OKãAPIãã¶ã€ã³ã¯æ¬¡ã®ããã«èŠããŸãïŒ
public interface IReadOnlySet<T> : IReadOnlyCollection<T> {
bool Contains(T item);
}
ããã¯èª°ããåæã§ããããã«èŠãããã¶ã€ã³ã®å¯äžã®å ±ééšåã§ãã
ããã§ãã¶ã€ã³ãçµäºããŸãã å°æ¥æ¡åŒµãããå Žåã¯ãå¥ã®åé¡ã§æ¡åŒµããŠãã ããã ããã¯ã補åã«å«ãŸããã¹ãæãéèŠãªæ©èœã§ãã
誰ãè³æã誰ãå察ã§ããïŒ
@ashmindã®ææ¡ã奜ãã§ãã æè¡çã«ã¯IReadOnlySet<TKey>
ãããDictionary.Keysããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ã§ããã°çŽ æŽããããšæããŸãã
ãããapi-ready-for-review
ãšããŠããŒã¯ããŠããã ããŸããïŒ ç§ã¯èªåèªèº«ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãåã³å¿
èŠãšããŠããããšã«æ°ã¥ããŸããããããŠããã¯ãŸã ããã«ãããŸããã
ãªãããããŸã å®è£ ãããŠããªãã®ã§ããïŒ
[ç·šé]ãè©«ã³-ç§ã®æåã®è¿ä¿¡ã¯å¥ã®APIãšæ··åãââããŠããŸããã ç§ã¯ããã«ã€ããŠåŒ·ãæèŠãæã£ãŠããŸãããããã¹ãç·šéã æ··ä¹±ãããŠç³ãèš³ãããŸããïŒ
ãªãããããŸã å®è£ ãããŠããªãã®ã§ããïŒ
APIã¯ãŸã ãšãªã¢ææè
ã®æ³šç®ãéããŠããŸãã-@ safernã ã³ã¬ã¯ã·ã§ã³ã®åªå
é äœãªã¹ãã§ã©ãã ãé«ããããããŸããã è³æ祚ã®æ°ã¯ããªãå€ãã§ãã
çå®ã¯ãçŸåš.NET Core 3.0ãããã¯ããŠã³ããŠããããã3.0ã«ãšã£ãŠéèŠã§ã¯ãªããããå°ãªããšã次ã®ãªãªãŒã¹ãåŸ
ã€å¿
èŠããããšããããšã§ãã
ãããç®±ããåºããŠæäŸãããŠããªãããšã«ãé©ããŠããŸãã
äžå€ã®ããŒã¿æ§é ã¯ãã³ãŒãã®ä¿å®æ§ãåäžãããã®ã«å€§ãã«åœ¹ç«ã¡ãŸãããã»ãã³ãã£ã¯ã¹ãæå®ããããŸããŸãªå®è£ ãé£æºãããæšæºã©ã€ãã©ãªã®ã€ã³ã¿ãŒãã§ã€ã¹ãªãã§ã¯äœ¿çšã§ããŸããã
ããããªããšããã©ã¡ãŒã¿/æ»ãå€ãšããŠäžå€ã»ããã䜿çšããããšãæå³ããåã©ã€ãã©ãªã¯ãå¹çãäœãæå³çã«æ£ãããªãIEnumerableã䜿çšããããä»ã®äººãšäºææ§ã®ãªãç¬èªã®ã€ã³ã¿ãŒãã§ã€ã¹/ã¯ã©ã¹ã眲åã«äœ¿çšããå¿ èŠããããŸãã
Contains
ã«ãã¯ã¢ããã«é¢ããŠå¹ççã§ããã©ã¡ãŒã¿ãŒ/æ»ãå€ã®å
·äœçãªã¿ã€ããæå®ããªãããã«ããåé¿çããããã©ããç¥ãããã§ãã é ã®äžã§èããããæåã®æ¹æ³ã¯ã眲åã§IEnumerableã䜿çšããReadOnlyDictionary.Keysãæž¡ãããšã§ãããç¹ã«ã©ã€ãã©ãªã§ã¯ãããã¯å°ãåä»ãªããã§ãã Linqã®Enumerable.Contains
ã¯Contains
ã®ã³ã¬ã¯ã·ã§ã³å®è£
ã䜿çšãããããããã¯äºææ§ããããªããå¹ççã§ããã¯ãã§ãããããã©ãŒãã³ã¹ã®äœãå®è£
ã®äœ¿çšã«ã€ãªããå¯èœæ§ã®ããæå³ãäŒéããŸããã
@ adamt06ããªãã¯ISet<T>
æ¢ããŠããŸãã
@scalablecoryããªãã¯æ£ããã§ããäžå€ã®å®è£
ã§ã1ã€ãããŸãïŒ ImmutableHashSet<T>
誰ããICollectionã®çç±ãç¥ã£ãŠãã/ç解ããŠããŸãã
ããã¯ãã®ã¹ã¬ããã«å°ãé¢ä¿ããããšæããŸããã ç§ã®ä»£ããã«æ°ããã¹ã¬ãããéããŸãã å€åç§ã¯äœãã誀解ããŠããã ãã§ãã
å¥ã®èãã§ãããå®å šã«ãããã¯ããå€ããŠããŸããReaOnlyCollectionã«æ¬¡ã®æ©èœããªãã®ã¯ãªãã§ããã
c#
bool Contains(T item);
void CopyTo(T[] array, int arrayIndex);
é倧ãªå€æŽãšé¢ä¿ããããŸããã詳现ã¯èŠããŠããŸããã
ReadOnlyCollectionã«ã¯æ¬¡ã®ãã®ããããŸãã
https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.readonlycollection-1.contains
https://docs.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.readonlycollection-1.copyto
ãããIReadOnlyCollectionã«ãããããªããšããæå³ã ãšæããŸãã ãã以å€ã®å Žåãã€ã³ã¿ãŒãã§ãŒã¹ã¯å ±å€ã§ã¯ãªãå¯èœæ§ãããããã§ãã
ããããããŸããããäžäœäºææ§ã®åé¡ãåŒãèµ·ããæ瀺çãªã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã«é¢ä¿ããŠããå¯èœæ§ããããŸãã æ¢åã®ã€ã³ã¿ãŒãã§ãŒã¹ãæŽæ°ããŠä»ã®ã€ã³ã¿ãŒãã§ãŒã¹ããç¶æ¿ããããšãåé¡ã«ãªãçç±ã¯ããããŸãããæ°ããã€ã³ã¿ãŒãã§ãŒã¹IReadOnlySet<T>
ãäœæãã HashSet
å®è£
ãããããšãåé¡ã«ãªãçç±ã¯ããããŸããã
ããã£ãã ããããããã§ãICollectionã¯è¡šç€ºãããŸãã
c#
ICollection<T> : IReadOnlyCollection<out T>
èªã¿åã/æžã蟌ã¿ã³ã¬ã¯ã·ã§ã³ãèªã¿åãå°çšã³ã¬ã¯ã·ã§ã³ã®æ¡åŒµã§ããªãã®ã¯ãªãã§ããïŒ
@ generick0
ããã£ãã ããããããã§ãICollectionã次ã®ããã«ãªã£ãŠã¯ãããªãããšãããããŸããã
ICollection<out T> : IReadOnlyCollection<out T>
èªã¿åã/æžã蟌ã¿ã³ã¬ã¯ã·ã§ã³ãèªã¿åãå°çšã³ã¬ã¯ã·ã§ã³ã®æ¡åŒµã§ããªãã®ã¯ãªãã§ããïŒ
ãŸãã ICollection<T>
ã«ã¯ã¡ã³ããŒ.Add(T item)
ãããããã ICollection<T>
ICollection<out T>
ã宣èšã§ããªãããšã«æ³šæããŠãã ããã
次ã«ã ICollection<T>
ã¯.net-2.0ã«è¡šç€ºããã IReadOnlyCollection<out T>
ã¯.net-4.5ã«è¡šç€ºãããããšã«æ³šæããŠãã ããã ICollection<T>
ãå®è£
ããããã«ã³ãŒããã³ã³ãã€ã«ãã次ã«ICollection<T>
ãå€æŽããŠæ°ããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšã ICollection<T>
ã®ã¿ãå®è£
ãããã®ã«ã¯ãã®æ©èœããªããããæ¢åã®ã³ã³ãã€ã«æžã¿ãã€ããªã¯å®è¡æã«ç ŽæããŸãã IReadOnlyCollection<T>
ã¹ãããã¯ã³ã³ãã€ã©ã«ãã£ãŠïŒããããèªåçã«ïŒåããããŸãã ããã¯ã ICollection<T>
ãIReadOnlyCollection<T>
å®è£
ã§ããªãã£ãäºææ§ã®åé¡ã§ãã
ç§ã¯ããããã®SOã®çãã«ãã£ãŠæ確ã«å¯ŸåŠãããŠãããšã¯æããŸããããããã«å¯ŸããSOããããŸãïŒ //stackoverflow.com/a/14944400 ã
@binki "ICollection
DotNetStandard inet461ã ãããŠããããå€åã®ããã¹ãå Žæã§ãã ãããã¹ã¿ã³ããŒã2+
ç¹°ãè¿ããŸã...
èªã¿åã/æžã蟌ã¿ã³ã¬ã¯ã·ã§ã³ãèªã¿åãå°çšã³ã¬ã¯ã·ã§ã³ã®æ¡åŒµã§ããªãã®ã¯ãªãã§ããïŒ
ãããŠãé²åºãæžããããã«ãã³ã¬ã¯ã·ã§ã³ãããšãã°ãToArrayïŒïŒãã«ãã£ã¹ãããå¿ èŠãããã®ã¯ãªãã§ããïŒ
ãããŠãããªãã¯ç©äºãå£ãããšãªããããé«ãããŒãžã§ã³ã§æ°ããã€ã³ã¿ãŒãã§ãŒã¹ãè¿œå ããããšãã§ããããã§ãã ICollectionã«ã¯ããã§ã«IReadOnlyCollectionã¡ãœãããå®è£ ãããŠããŸãã 泚æãå£ããã¹ãã§ãã...ïŒ-/
@ generik0ããªããèããŠãããœãŒã¹ã®äºææ§ãå£ããªãããã«èŠããŸã[èããŠããŸããã§ããã ]ã§ãããCïŒã§ã¯ãªãILããŒãã«ã§æ©èœãããã€ããªäºææ§ã倱ãããŸãã
OK @ jnm2ããããšãã
ç§ã¯ä»ãç§ã®ãªããããã¯ã®æŽèšãæ¢ããŸãããã ãããæªãã¢ãŒããã¯ãã£ã ãšæããŸãã èããŠ/説æããŠãããŠããããšã:-)
@ jnm2
@ generick0ããªããèããŠãããœãŒã¹ã®äºææ§ãå£ããªãããã«èŠããŸãããCïŒã§ã¯ãªãILããŒãã«ã§æ©èœãããã€ããªã®äºææ§ãå£ããŸãã
ïŒç³ãèš³ãããŸãããïŒãœãŒã¹ã.net-4.5ããåã®ICollection<T>
ãæ瀺çã«å®è£
ããŠããå Žåã¯ããœãŒã¹ã®äºææ§ãæãªãããŸãã IReadOnlyCollection<T>.Count
ãæ瀺çã«å®è£
ã§ããªãã£ããããã¯ã©ã¹ã®ã³ã³ãã€ã«ã«å€±æãå§ããŸããã ãã ãããã€ããªã®äºææ§ã¯ãããŸããŸãª.netããŒãžã§ã³ãã¿ãŒã²ããã«ã§ããªãããããã倧ããªåé¡ã«ãªããŸãïŒ.net-4.5以äžã§å®è¡ããã«ã¯ã.net-2æªæºãšã¯ç°ãªããã€ããªã䜿çšããå¿
èŠããããŸããå€ããã¬ãŒã ã¯ãŒã¯ã ããã¿ãŒã²ããã«ããã®ã§ã¯ãªããäž¡æ¹ãã¿ãŒã²ããã«ããå¿
èŠããããŸãïŒã
ICollection<T>
ã.NET Core 3.0以éã®IReadOnlyCollection<T>
ãå®è£
ã§ãããã©ãããCïŒ8ã«ããã©ã«ãã®ã€ã³ã¿ãŒãã§ã€ã¹å®è£
ãµããŒããè¿œå ãããŠãããã©ããçåã«æã£ãŠããŸãã
ãã¶ãæ¡åŒµãå¿ èŠã§ãããããŠããã¯å°ãªããšãåãã³ã¬ã¯ã·ã§ã³ã§ãã ã€ãŸããreaadonlycollectionã«ç¡æ°ãŸãã¯icollectionãååŸããå¿ èŠãããå Žå...äœãèãã¯ãããŸããïŒ
[ @ jnm2ã³ã¡ã³ãã§ç·šé]
c#
public static class CollectionExtensions
{
public static IReadOnlyCollection<T> CastAsReadOnlyCollection<T>(this IEnumerable<T> collection)
{
if((collection is IReadOnlyCollection<T> readOnlyCollection ))
{
return readOnlyCollection ;
}
throw new ArgumentException($"{collection.GetType()} not supported as readonly collection");
}
}
@ generick0ãã®ã¡ãœãããåŒã³åºã代ããã«ã enumerable as IReadOnlyCollection<T> ?? throw ...
ãŸãã¯(IReadOnlyCollection<T>)enumerable
䜿çšããªãã®ã¯ãªãã§ããïŒ
@ jnm2omg ã ããªããæ£ããã§ãã æã ããªãã¯æ確ãªçµµãèŠããç©äºãé床ã«è€éã«ããŸã!!!
ç°¡åã«ããããã«ãç§ã¯ãŸã æ¡åŒµæ©èœãåŒã³åºããŸã;-)
ã©ãã....
ããã®ç¶æ³ã¯ã©ãã§ããïŒ ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãæšæºã®libã«å ¥ããŠãHashSet <>ã«å®è£ ããŠãããããã§ãã
Shapesã®ææ¡ãïŒããŸãããã°ïŒå®è£
ããããŸã§ãããå°ãåŸ
ã€ã®ãæåã®çã®ããã§ãã 次ã«ãå¿
èŠãªã»ããã¿ã€ããè¡šã圢ç¶ã®ã°ã«ãŒããäœæãã HashSet<T>
ãªã©ã®æ¢åã®ã»ããããããã«æºæ ããããã«å®è£
ãæäŸã§ããŸãã
次ã«ããããæ£ç¢ºã«è¡ãããã®ã³ãã¥ããã£ã©ã€ãã©ãªãåºçŸããããŸããŸãªã¿ã€ãã®ã»ããïŒæå³çïŒè¿°èªïŒããã³æ¡åŒµïŒãªã¹ãïŒãé åºä»ããéšåçé åºä»ããé åºãªããå¯ç®ãæ°ãåããªãã»ã©ç¡éãæ°ããããªãç¡éãããããRationalã®ãããªæ°åŠãã¡ã€ã³ïŒããã¹ãŠã«ããŒããŸãã ãèªç¶æ°ãªã©ïŒãããŸããŸãªåœ¢ãšããŠããããã®ã»ããã«å¯ŸããŠãããã³ãããã®ã»ããéã§å®çŸ©ããããã¹ãŠã®çµåãå ±ééšåãã«ãŒãã£ããªãã£ã¡ãœããã䜿çšããŸãã
ããã¯ç§ã«ã¯5幎å ã®ããã«èãããŸãã 1æ¥ã§å®è£ ã§ããåçŽãªå€æŽãã1000å倧ããããŸã æå®ãããŠããªãæ©èœãçºçããªãå¯èœæ§ãããã®ãåŸ ã€å¿ èŠãããã®ã¯ãªãã§ããïŒ
ããã¯ç§ã«ã¯5幎å ã®ããã«èãããŸãã 1æ¥ã§å®è£ ã§ããåçŽãªå€æŽãã1000å倧ããããŸã æå®ãããŠããªãæ©èœãçºçããªãå¯èœæ§ãããã®ãåŸ ã€å¿ èŠãããã®ã¯ãªãã§ããïŒ
ç§ã¯IReadOnlySet<T>
ã®é²å±ã®æ¬ åŠã«å¯Ÿå¿ããŠããã ãã§ã-ãã®åé¡ã¯çµå±4幎åŸã«ãã§ã«éãããŠããŸãã
Microsoftã®ããæ¹ïŒæãåçŽã§äŸ¿å©ãªããšã«ã¯æ°å幎ããããŸãã ããã¯æ°ãé ããªãã 5幎ãšæ°ããŸãã
ããã«é¢çœãã®ã¯ã圌ããããã«ãããæã£ãŠãããšããããšã§ã
https://docs.microsoft.com/en-us/dotnet/api/microsoft.sqlserver.management.sdk.sfc.ireadonlyset-1
@terrajobstã®èãïŒ
ISet<T>
ãIReadOnlySet<T>
ISet<T>
æ¡åŒµãããããšã¯ã§ããŸããïŒä»ã®å¯å€ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯å®è¡ã§ããªãã£ãã®ãšåãçç±ã§ïŒã åŸã®æ®µéã§ReadOnlySet<T>
ãè¿œå ã§ããŸãã IReadOnlySet<T>
ãISet<T>
ããå¯å€APIãå·®ãåŒãããã®ã§ããããšãå確èªããå¿
èŠããããŸããImmutableSortedSet<T>
ãšImmutableHashSet<T>
ïŒããã³ãããã®ãã«ããŒïŒã«IReadOnlySet<T>
ãå®è£
ããå¿
èŠããããŸãISet<T>
ä»ã®å®è£
ãã¹ãã£ã³ããå¿
èŠããããŸãã namespace System.Collections.Generic {
+ public interface IReadOnlySet<out T> : IReadOnlyCollection<T>, IEnumerable, IEnumerable<T> {
+ bool Contains(T value);
+ bool IsProperSubsetOf(IEnumerable<T> other);
+ bool IsProperSupersetOf(IEnumerable<T> other);
+ bool IsSubsetOf(IEnumerable<T> other);
+ bool IsSupersetOf(IEnumerable<T> other);
+ bool Overlaps(IEnumerable<T> other);
+ bool SetEquals(IEnumerable<T> other);
+ }
- public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
- public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+ public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T>, IReadOnlySet<T> {
}
}
ããããããŠïŒ
@terrajobst
ISet<T>
ãIReadOnlySet<T>
ISet<T>
æ¡åŒµãããããšã¯ã§ããŸããïŒä»ã®å¯å€ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯å®è¡ã§ããªãã£ãã®ãšåãçç±ã§ïŒã
ããã¯ãããã©ã«ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã䜿çšããŠãåœãŠã¯ãŸããŸããïŒ ããã¯https://github.com/dotnet/corefx/issues/41409ãéããå¿ èŠããããšããæå³ã§ããïŒ
@terrajobst
ISet<T>
ãIReadOnlySet<T>
ISet<T>
æ¡åŒµãããããšã¯ã§ããŸããïŒä»ã®å¯å€ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯å®è¡ã§ããªãã£ãã®ãšåãçç±ã§ïŒãããã¯ãããã©ã«ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã䜿çšããŠãåœãŠã¯ãŸããŸããïŒ ããã¯dotnet / corefxïŒ41409ãéããå¿ èŠããããšããæå³ã§ããïŒ
ããã«ã€ããŠè©±ãåããŸããã 以åã¯DIMãããœãªã¥ãŒã·ã§ã³ãæ€èšãããšãããéåžžã¯ã·ã£ãŒããã€ã¢ã¢ã³ããçæããããããŸããªäžèŽãçºçãããšçµè«ä»ããŸããã ããããããã¯æè¿ææŠãããã®ã§ãç§ã¯ãããæžãçããŠããããå®éã«æ©èœããŠãããã©ããã確èªããå¿ èŠããããšæããŸãã
@terrajobst / @danmosemsft誰ããããã«å²ãåœãŠãããŠããŸããïŒ
ãããŠãç§ãã¡ãéæãããä»äºãæ確ã«ããããã®@terrajobstã¯æ¬¡ã®ãšããã§ãã
`` `
IReadOnlySetãå®è£
ããå¿
èŠããããŸã
ISetã®ä»ã®å®è£
ãã¹ãã£ã³ããå¿
èŠããããŸã
ãã
äžèšã®ã€ã³ã¿ãŒãã§ãŒã¹ãHashSetãSortedSetã«å®è£
ããã ãã§ãªãã
ã¹ãã£ã³ã¯ãã äœããæ¢ããŠãçããããšæãããå Žåã¯ããã衚瀺ããŸãã
ããããŸã æã«å ¥ããªããç§ã¯èå³ãããã§ããã
@Jlalondããããããªãã«å²ãåœãŠãããŸããã ç³ãåºã«æè¬ã
@danmosemsft @terrajobst
ãã ã®æŽæ°ã ç§ã¯ããã«åãçµãã§ããããã©ã€ããŒãã³ã¢Libã«ã€ã³ã¿ãŒãã§ã€ã¹ãè¿œå ããcollections.genericãšäžå€ã®ãããååŸããæ¹æ³ãèŠã€ããŸããã
ãã³ãé ããç¥ã£ãŠããå Žåã®æåŸã®è³ªåã§ãããããã®ããã«ã¢ãã«å€æŽãå ããå¿ èŠããããŸããïŒ corefxãã©ãã§çµãããmonoãã©ãããå§ãŸãã®ãã«ã€ããŠã¯æŽå¯åããããŸããã ã ããããªãããããããã€ãã®ç¬ç«ããç 究ããç§ãæãããšãã§ããããšãç¥ã£ãŠãããªã
@JlalondMonoã«å€æŽãå ããå¿
èŠã¯ãããŸããã Monoã©ã³ã¿ã€ã ããã®ãªããžããªã«ç§»åããçç±ã®äžéšã¯ãCoreCLRãŸãã¯Monoã©ã³ã¿ã€ã ã®ããããã§ãŸã£ããåãã©ã€ãã©ãªãã·ãŒã ã¬ã¹ã«äœ¿çšã§ããããã«ããããã§ãã åå²ããã³ã¢ã©ã€ãã©ãªã®ããäžéšã®ã¿ããããŸãã
coreclrsrcSystem.Private.CoreLibãšmononetcoreSystem.Private.CoreLibã ïŒã³ã¢ã©ã€ãã©ãªã®ã»ãšãã©ã¯ãlibrariesSystem.Private.CoreLibããå
±æãããŸãïŒã ãããã£ãŠãããã«è§Šããªãéãã圱é¿ã¯ãããŸããã
@danmosemsft説æããŠãããŠããããšããç§ã¯ãããããã«è¡ãããããšãæãã§ããŸãã
ãã@danmosemsftã¯ããããã©ããŒã¢ããããã ãã§ãã CoreLibã¯srcã¢ã»ã³ããªã«çµã¿èŸŒãŸããŠããŸãããåç §ãããŠããå€æŽã確èªã§ããŸãã ãã ããrefã¢ã»ã³ããªã¯å€æŽãæ€åºããŠããªãããã§ãã ãããç§ãæ©ãŸããŠãããã¹ãŠã§ãããããã¥ã¡ã³ãã«æ å ±ãèŠã€ãããŸããã ç§ããããæãéããããšãã§ããããã«ããªããç§ã«äžããããšãã§ãã人ããã€ã³ã¿ãŒïŒã€ãŸãã5幎åŸïŒ
ïŒ32488ã§å¯ŸåŠ
æãåèã«ãªãã³ã¡ã³ã
ææ¡ãããAPIèšèšïŒ
ããã¯
ISet<>
APIã«åºã¥ããŠããŸãïŒæããã«ãã¥ãŒããŒã·ã§ã³ã¡ãœãããé€ãïŒãComparer
ãããã«åœãŠã¯ãŸããªãã®ã¯æ®å¿µã§ãããISet<>
ãIReadOnlyDictionary<>
æ¯èŒå¯Ÿè±¡ãå ¬éããŠããªããããä»ããä¿®æ£ããã«ã¯é ãããŸãã