teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

11

コード修正

2020/11/25 08:28

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -30,7 +30,7 @@
30
30
  private readonly int _size;
31
31
  public FixedLengthList(int size)
32
32
  {
33
- _list = Enumerable.Range(0,size).Select(x => default(T)).ToList();
33
+ _list = new T[size].ToList();
34
34
  this._size = size;
35
35
  }
36
36
 

10

コード修正

2020/11/25 08:28

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  public void Add(T element)
48
48
  {
49
- if (_list.Count() > _size)
49
+ if (_list.Count() >= _size)
50
50
  {
51
51
  _list.RemoveAt(0);
52
52
  }

9

コード修正

2020/11/25 08:27

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -116,11 +116,11 @@
116
116
  }
117
117
 
118
118
  public AddVector3(Vector3 v){
119
- _vectors.add(v);
119
+ _vectors.Add(v);
120
120
  }
121
121
 
122
122
  public AddQuaternion(Quaternion q){
123
- _quaternions.add(q);
123
+ _quaternions.Add(q);
124
124
  }
125
125
  }
126
126
  ```

8

文章の修正

2020/11/25 08:25

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -98,4 +98,29 @@
98
98
  return ((IList<T>)_list).GetEnumerator();
99
99
  }
100
100
  }
101
+ ```
102
+
103
+ > 現在同じ処理をそれぞれ型の違う(Vector3/Quaternion/float)数値へかけています。
104
+ そこで処理を共通化したい
105
+
106
+ ```C#
107
+ public class A
108
+ {
109
+ private const int ListSize = 5;
110
+ private FixedLengthList<Vetctor3> _vectors = new FixedLengthList<Vetctor3>(ListSize);
111
+ private FixedLengthList<Quaternion> _quaternions = new FixedLengthList<Quaternion>(ListSize);
112
+ private FixedLengthList<float> _floatValues = new FixedLengthList<float>(ListSize);
113
+
114
+ public void Method(){
115
+ //TODO: _vectors,_quaternions,_floatValues を参照して何かを処理する;
116
+ }
117
+
118
+ public AddVector3(Vector3 v){
119
+ _vectors.add(v);
120
+ }
121
+
122
+ public AddQuaternion(Quaternion q){
123
+ _quaternions.add(q);
124
+ }
125
+ }
101
126
  ```

7

そもそもAクラスの必要性があるかもよく分からない

2020/11/25 08:24

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -30,7 +30,7 @@
30
30
  private readonly int _size;
31
31
  public FixedLengthList(int size)
32
32
  {
33
- _list = new T[size].ToList();
33
+ _list = Enumerable.Range(0,size).Select(x => default(T)).ToList();
34
34
  this._size = size;
35
35
  }
36
36
 
@@ -98,16 +98,4 @@
98
98
  return ((IList<T>)_list).GetEnumerator();
99
99
  }
100
100
  }
101
- ```
101
+ ```
102
-
103
- するとAクラスが非常にシンプルになります。
104
- ```C#
105
- public class A
106
- {
107
- private const int ListSize = 5;
108
- private FixedLengthList<string> _strList = new FixedLengthList<string>(ListSize);
109
- private FixedLengthList<float> _floatList = new FixedLengthList<float>(ListSize);
110
- }
111
- ```
112
-
113
- これでこの質問で抱えていたそもそもの問題は回避できます。

6

文章の修正

2020/11/25 08:11

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ---
22
22
 
23
- 記載されたコードでやりたいことは、ジェネリックで指定できる最新の要素のみを保持する固定長のコレクションを用意すれば実現できませんか?
23
+ ジェネリックで型を指定できる最新の要素のみを保持する固定長のコレクションを用意すれば実現できませんか?
24
24
 
25
25
  試しに作りました。
26
26
  ```C#

5

そもそもListクラスで例外が出るだろうからいらないか… なので消しました。

2020/11/25 08:05

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -65,10 +65,6 @@
65
65
 
66
66
  public void CopyTo(T[] array, int arrayIndex)
67
67
  {
68
- if (arrayIndex >= _size)
69
- {
70
- throw new IndexOutOfRangeException();
71
- }
72
68
  _list.CopyTo(array, arrayIndex);
73
69
  }
74
70
 
@@ -84,10 +80,6 @@
84
80
 
85
81
  public void Insert(int index, T item)
86
82
  {
87
- if (index >= _size)
88
- {
89
- throw new IndexOutOfRangeException();
90
- }
91
83
  _list.Insert(index, item);
92
84
  }
93
85
 
@@ -98,10 +90,6 @@
98
90
 
99
91
  public void RemoveAt(int index)
100
92
  {
101
- if (index >= _size)
102
- {
103
- throw new IndexOutOfRangeException();
104
- }
105
93
  _list.RemoveAt(index);
106
94
  }
107
95
 

4

しょぼいコーディングバグ

2020/11/25 08:04

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -65,6 +65,10 @@
65
65
 
66
66
  public void CopyTo(T[] array, int arrayIndex)
67
67
  {
68
+ if (arrayIndex >= _size)
69
+ {
70
+ throw new IndexOutOfRangeException();
71
+ }
68
72
  _list.CopyTo(array, arrayIndex);
69
73
  }
70
74
 
@@ -75,15 +79,15 @@
75
79
 
76
80
  public int IndexOf(T item)
77
81
  {
78
- if (index >= _size)
79
- {
80
- throw new IndexOutOfRangeException();
81
- }
82
82
  return _list.IndexOf(item);
83
83
  }
84
84
 
85
85
  public void Insert(int index, T item)
86
86
  {
87
+ if (index >= _size)
88
+ {
89
+ throw new IndexOutOfRangeException();
90
+ }
87
91
  _list.Insert(index, item);
88
92
  }
89
93
 
@@ -94,6 +98,10 @@
94
98
 
95
99
  public void RemoveAt(int index)
96
100
  {
101
+ if (index >= _size)
102
+ {
103
+ throw new IndexOutOfRangeException();
104
+ }
97
105
  _list.RemoveAt(index);
98
106
  }
99
107
 

3

追記

2020/11/25 08:03

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -16,4 +16,102 @@
16
16
 
17
17
  > 使用したコンストラクタによりメソッドが有効化されるようなことはできないのか
18
18
 
19
- 言語仕様にないので出来ません。その必要がないと判断されているからです。
19
+ 言語仕様にないので出来ません。その必要がないと判断されているからです。
20
+
21
+ ---
22
+
23
+ 記載されたコードでやりたいことは、ジェネリックで指定できる最新の要素のみを保持する固定長のコレクションを用意すれば実現できませんか?
24
+
25
+ 試しに作りました。
26
+ ```C#
27
+ public class FixedLengthList<T> : IList<T>
28
+ {
29
+ private readonly List<T> _list;
30
+ private readonly int _size;
31
+ public FixedLengthList(int size)
32
+ {
33
+ _list = new T[size].ToList();
34
+ this._size = size;
35
+ }
36
+
37
+ public T this[int index]
38
+ {
39
+ get => _list[index];
40
+ set => _list[index] = value;
41
+ }
42
+
43
+ public int Count => _list.Count;
44
+
45
+ public bool IsReadOnly => ((IList<T>)_list).IsReadOnly;
46
+
47
+ public void Add(T element)
48
+ {
49
+ if (_list.Count() > _size)
50
+ {
51
+ _list.RemoveAt(0);
52
+ }
53
+ _list.Add(element);
54
+ }
55
+
56
+ public void Clear()
57
+ {
58
+ _list.Clear();
59
+ }
60
+
61
+ public bool Contains(T item)
62
+ {
63
+ return _list.Contains(item);
64
+ }
65
+
66
+ public void CopyTo(T[] array, int arrayIndex)
67
+ {
68
+ _list.CopyTo(array, arrayIndex);
69
+ }
70
+
71
+ public IEnumerator<T> GetEnumerator()
72
+ {
73
+ return ((IList<T>)_list).GetEnumerator();
74
+ }
75
+
76
+ public int IndexOf(T item)
77
+ {
78
+ if (index >= _size)
79
+ {
80
+ throw new IndexOutOfRangeException();
81
+ }
82
+ return _list.IndexOf(item);
83
+ }
84
+
85
+ public void Insert(int index, T item)
86
+ {
87
+ _list.Insert(index, item);
88
+ }
89
+
90
+ public bool Remove(T item)
91
+ {
92
+ return _list.Remove(item);
93
+ }
94
+
95
+ public void RemoveAt(int index)
96
+ {
97
+ _list.RemoveAt(index);
98
+ }
99
+
100
+ IEnumerator IEnumerable.GetEnumerator()
101
+ {
102
+ return ((IList<T>)_list).GetEnumerator();
103
+ }
104
+ }
105
+ ```
106
+
107
+ するとAクラスが非常にシンプルになります。
108
+ ```C#
109
+ public class A
110
+ {
111
+ private const int ListSize = 5;
112
+ private FixedLengthList<string> _strList = new FixedLengthList<string>(ListSize);
113
+ private FixedLengthList<float> _floatList = new FixedLengthList<float>(ListSize);
114
+ }
115
+ ```
116
+
117
+ これでこの質問で抱えていたそもそもの問題は回避できます。

2

文章の修正

2020/11/25 08:01

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  利用者に、ドキュメントを読んで使うという意識があれば間違うことはありません。
9
9
  その意識がなければ、そもそもプログラマとしてどうかを疑います。
10
10
 
11
- [Convertクラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.convert?view=net-5.0#methods)を見てください。`ToByte`メソッド、`ToBoolean`メソッドなどはオーバーロードていますが、ドキュメントを読めば間違うことはありません。
11
+ [Convertクラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.convert?view=net-5.0#methods)を見てください。`ToByte`メソッド、`ToBoolean`メソッドなどはオーバーロードを多く行っていますが、ドキュメントを読めば引数を渡し間違うことはありません。
12
12
 
13
13
  よって、余程疲れていない限りプログラマなら間違って使うことは無いはずなので、問題にはなりません。
14
14
 

1

文章の修正

2020/11/25 06:46

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -5,8 +5,8 @@
5
5
 
6
6
  VisualStudioを使っていれば、コンストラクタ呼び出しの記述にカーソルを合わせる事でXMLコメントの内容や渡している引数を見る事が出来ます。
7
7
 
8
- 利用者に、ドキュメントを読んで使うという文化があれば間違うことはありません。
8
+ 利用者に、ドキュメントを読んで使うという意識があれば間違うことはありません。
9
- その文化がなければ、そもそもプログラマとしてどうかを疑います。
9
+ その意識がなければ、そもそもプログラマとしてどうかを疑います。
10
10
 
11
11
  [Convertクラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.convert?view=net-5.0#methods)を見てください。`ToByte`メソッド、`ToBoolean`メソッドなどはオーバーロードしていますが、ドキュメントを読めば間違うことはありません。
12
12