回答編集履歴
5
ImmutableHashSet<T> の話を追加
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は対応していないのでもう一つの方法を追伸に記載
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
一寸修正
test
CHANGED
@@ -40,4 +40,4 @@
|
|
40
40
|
1, 2, 3, 4, 5, 6
|
41
41
|
```
|
42
42
|
|
43
|
-
[sharplab](https://sharplab.io/#v2:
|
43
|
+
[sharplab](https://sharplab.io/#v2:C4LgTgrgdgPgAgJgIwFgBQcAMACOSAsA3OlrkgHQDCA9gDa0CmAxsAJbVQDO5A8gEYArZsACy1ACYNaxNAG902RdgAyrTsAA8rKMAB82bcFXrsAXmwBtJABoE1gMzX81gKwBdGUuwA3AIZhsAPNDY2ByAEFOACUGX3EeKFoATwAKAEpPJQBJGLiE5Jp6YXYoLR19MAQzQMzFPABOFMryAHEGYAAVJIAHBnSMhSUGlLxMcgApam0UgCJrbDnKtIG0LxC1MPDxcRSANhWvYdGJqahZ+cWEZZkAX3R5VaUACV9OAAsAZXayvQMdUOqVlsDicrg8g0UfgCQWwUAYAHdsLl4okkl9NIZdCl1uoDtlkfkkoVGCwSj8KlVzGBamRGs02p0en1rhDaSMkGNJtM5gtrEs8YocZttnsBWzjlyzjzLiy0Hc0OhFWggA)
|
2
参考リンクの追加
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
サンプルの元の変更の話を追加
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
|
-
|
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==)
|