回答編集履歴

5

ImmutableHashSet<T> の話を追加

2025/01/17 09:38

投稿

juner
juner

スコア562

test CHANGED
@@ -45,3 +45,28 @@
45
45
  ## 追伸
46
46
 
47
47
  ただ、`ReadOnlySet<T>` は .NET 9 からで、 Unity は .NET 9 にまだ対応していない為、やるのであれば `IReadOnlyCollection<int>` へのキャストが一番無難な気もします。(ただし、利用側が `HashSet<T>` にダウンキャストすると書き込み可能なことに注意は必要だが、自分でやるだけならそれでも問題は無い
48
+
49
+ ## 追伸の追伸
50
+
51
+ もしも `HashSet<T>` ではなくて `ISet<T>` でもよいのであれば `ImmutableHashSet<T>` を使うのも手です。
52
+
53
+ ```cs
54
+ using System;
55
+ using System.Collections.Immutable;
56
+
57
+ ImmutableHashSet<int> hashSet = [1,2,3,4,5];
58
+ Console.WriteLine($"hashSet: {string.Join(", ",hashSet)}");
59
+ var newHashSet = hashSet.Add(6);
60
+ Console.WriteLine($"hashSet: {string.Join(", ",hashSet)}");
61
+ Console.WriteLine($"newHashSet: {string.Join(", ",newHashSet)}");
62
+ ```
63
+
64
+ ```output
65
+ hashSet: 1, 2, 3, 4, 5
66
+ hashSet: 1, 2, 3, 4, 5
67
+ newHashSet: 1, 2, 3, 4, 5, 6
68
+ ```
69
+
70
+ [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSB0AwgPYA2pApgMbACWxUAzvgJIC2bEwAhgEaUBudOnace/CgAlujABYBlCsAA8tKMAB82WTIVLsAXmwBtJABoEZgMxmALGYCsAXSEYkATgAUAEgBEOuUVQbABvPEx8ACliNU9fM2x4gL1gAEoAX19U1wA3bjBsKAoAd2lA/SNkoPwAQQATOs8ANmz0PC8/KqUQUPComKg4hKTdIIys13afXyLS0e7epAjo2PjEs1mylPHsoA===)
71
+
72
+ https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.immutable.immutablehashset-1?view=net-8.0

4

Unityは対応していないのでもう一つの方法を追伸に記載

2025/01/14 00:38

投稿

juner
juner

スコア562

test CHANGED
@@ -41,3 +41,7 @@
41
41
  ```
42
42
 
43
43
  [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSAsA3OlrkgHQDCA9gDa0CmAxsAJbVQDO5A8gEYArZsACy1ACYNaxNAG902RdgAyrTsAA8rKMAB82bcFXrsAXmwBtJABoE1gMzX81gKwBdGUuwA3AIZhsAPNDY2ByAEFOACUGX3EeKFoATwAKAEpPJQBJGLiE5Jp6YXYoLR19MAQzQMzFPABOFMryAHEGYAAVJIAHBnSMhSUGlLxMcgApam0UgCJrbDnKtIG0LxC1MPDxcRSANhWvYdGJqahZ+cWEZZkAX3R5VaUACV9OAAsAZXayvQMdUOqVlsDicrg8g0UfgCQWwUAYAHdsLl4okkl9NIZdCl1uoDtlkfkkoVGCwSj8KlVzGBamRGs02p0en1rhDaSMkGNJtM5gtrEs8YocZttnsBWzjlyzjzLiy0Hc0OhFWggA)
44
+
45
+ ## 追伸
46
+
47
+ ただ、`ReadOnlySet<T>` は .NET 9 からで、 Unity は .NET 9 にまだ対応していない為、やるのであれば `IReadOnlyCollection<int>` へのキャストが一番無難な気もします。(ただし、利用側が `HashSet<T>` にダウンキャストすると書き込み可能なことに注意は必要だが、自分でやるだけならそれでも問題は無い

3

一寸修正

2025/01/14 00:35

投稿

juner
juner

スコア562

test CHANGED
@@ -40,4 +40,4 @@
40
40
  1, 2, 3, 4, 5, 6
41
41
  ```
42
42
 
43
- [sharplab](https://sharplab.io/#v2:EYLgtghglgdgNAFxAJwK4wD4AEBMBGAWACgsAGAAizwBYBuYsyvAOgGEB7AG04FMBjBFHYwAzswDywAFb8EAWXYATHp3pEA3sXLbyAGSgiEAHlgIAfOVP7D5ALzkA2njg44AZjjU4AVgC6anXIANwhkcjD7KwMEZgBBEQAlHghFcRhOAE8ACgBKAJ0ASSSUtMyOblkhGBMYc3CcO3D87SoATizkHGYAcR4EABUMgAceXLytHTasqlJmACl2WCyAIjhyVc6c8aJAqMM4xUUsgDZtwKmZ+cWYFbWNnC21AF9iTR2dAAkIEQALAGU+jU6nsEI0nC53J4fP4JtoQmEIuQYDwAO7kYqpdIZAHGUxmLIgs6FDGlDLlXgCKpAiydRrIZpMdqdHp9QYjMYMi54WYLJardZwTZE7Qgg5HU6cvDtS68m78+6PYgvIjEVVEIA==)
43
+ [sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSAsA3OlrkgHQDCA9gDa0CmAxsAJbVQDO5A8gEYArZsACy1ACYNaxNAG902RdgAyrTsAA8rKMAB82bcFXrsAXmwBtJABoE1gMzX81gKwBdGUuwA3AIZhsAPNDY2ByAEFOACUGX3EeKFoATwAKAEpPJQBJGLiE5Jp6YXYoLR19MAQzQMzFPABOFMryAHEGYAAVJIAHBnSMhSUGlLxMcgApam0UgCJrbDnKtIG0LxC1MPDxcRSANhWvYdGJqahZ+cWEZZkAX3R5VaUACV9OAAsAZXayvQMdUOqVlsDicrg8g0UfgCQWwUAYAHdsLl4okkl9NIZdCl1uoDtlkfkkoVGCwSj8KlVzGBamRGs02p0en1rhDaSMkGNJtM5gtrEs8YocZttnsBWzjlyzjzLiy0Hc0OhFWggA)

2

参考リンクの追加

2025/01/14 00:29

投稿

juner
juner

スコア562

test CHANGED
@@ -1,4 +1,10 @@
1
1
  ReadOnlyCollection ではなく 読み取り専用であればいいの ニュアンスでしたら `IList<T>` に依存した `ReadOnlyCollection<T>` ではなく `ReadOnlySet<T>` を使った方がいいのではないでしょうか?
2
+
3
+ [ReadOnlyCollection<T> クラス (System.Collections.ObjectModel) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.readonlycollection-1?view=net-8.0)
4
+
5
+ [ReadOnlySet<T> クラス (System.Collections.ObjectModel) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.readonlyset-1?view=net-9.0)
6
+
7
+
2
8
  そうすれば 実装も読み取り専用になりますし、 読み取り専用インターフェスの `IReadOnlyCollection<T>` も使えます。
3
9
 
4
10
  ```cs

1

サンプルの元の変更の話を追加

2025/01/14 00:27

投稿

juner
juner

スコア562

test CHANGED
@@ -9,14 +9,29 @@
9
9
  List<int> intList = [1,2,3,4,5];
10
10
  var r = intList.AsReadOnly();
11
11
  IReadOnlyCollection<int> r2 = r;
12
- Console.WriteLine(r2);
12
+ Console.WriteLine(r2.GetType());
13
+ Console.WriteLine(string.Join(", ",r2));
14
+ intList.Add(6);
15
+ Console.WriteLine(string.Join(", ",r2));
13
16
  }
14
17
  {
15
18
  HashSet<int> intList = [1,2,3,4,5];
16
19
  var r = new ReadOnlySet<int>(intList);
17
20
  IReadOnlyCollection<int> r2 = r;
18
- Console.WriteLine(r2);
21
+ Console.WriteLine(r2.GetType());
22
+ Console.WriteLine(string.Join(", ",r2));
23
+ intList.Add(6);
24
+ Console.WriteLine(string.Join(", ",r2));
19
25
  }
20
26
  ```
21
27
 
22
- [sharplab](https://sharplab.io/#v2:EYLgtghglgdgNAFxAJwK4wD4AEBMBGAWACgsAGAAizwBYBuYsyvAOgGEB7AG04FMBjBFHYwAzswDywAFb8EAWXYATHp3pEA3sXLbyAGSgiEAHlgIAfOVP7D5ALzkA2njg44AZjjU4AVgC6anXIANwhkcjD7KwMEZgBBEQAlHghFcRhOAE8ACgBKAJ0ASSSUtMyOblkhGBMYc3CcO3D87SoATizkHDziAF9iTSJAgAkIEQALAGUeY1MLKJt7Jxd3Tx9/LR0QsIjyGB4Ad3Ji1PSMqZnasyz5hG7BwuPSjPLeASqaus7G5Gamds67n0iMQQUQgA===)
28
+ ```output
29
+ System.Collections.ObjectModel.ReadOnlyCollection`1[System.Int32]
30
+ 1, 2, 3, 4, 5
31
+ 1, 2, 3, 4, 5, 6
32
+ System.Collections.ObjectModel.ReadOnlySet`1[System.Int32]
33
+ 1, 2, 3, 4, 5
34
+ 1, 2, 3, 4, 5, 6
35
+ ```
36
+
37
+ [sharplab](https://sharplab.io/#v2:EYLgtghglgdgNAFxAJwK4wD4AEBMBGAWACgsAGAAizwBYBuYsyvAOgGEB7AG04FMBjBFHYwAzswDywAFb8EAWXYATHp3pEA3sXLbyAGSgiEAHlgIAfOVP7D5ALzkA2njg44AZjjU4AVgC6anXIANwhkcjD7KwMEZgBBEQAlHghFcRhOAE8ACgBKAJ0ASSSUtMyOblkhGBMYc3CcO3D87SoATizkHGYAcR4EABUMgAceXLytHTasqlJmACl2WCyAIjhyVc6c8aJAqMM4xUUsgDZtwKmZ+cWYFbWNnC21AF9iTR2dAAkIEQALAGU+jU6nsEI0nC53J4fP4JtoQmEIuQYDwAO7kYqpdIZAHGUxmLIgs6FDGlDLlXgCKpAiydRrIZpMdqdHp9QYjMYMi54WYLJardZwTZE7Qgg5HU6cvDtS68m78+6PYgvIjEVVEIA==)