.NET7から数値系の型はすべてSystem.Numerics.INumber<T>インターフェースを実装することとなった。
INumber<T>には数値への四則演算やその他基本的な演算が含まれているので、数値系のジェネリクスクラスが作成しやすくなっている。
簡単な例を以下に挙げる。
using System.Numerics;
public class NumberList<T> where T :INumber<T> {
protected List<T> Numbers { get; set; }
public NumberList() {
Numbers = new ();
}
public NumberList(IEnumerable<T> Values):
this() {
Numbers.AddRange(Values);
}
public void Append(T Value) {
Numbers.Add(Value);
}
public T Sum() {
T sum = T.Zero;
foreach(var v in Numbers) {
sum += v;
}
return sum;
}
public void Map(Func<T,T> Operation) {
for(int i=0; i < Numbers.Count; i++) {
Numbers[i] = Operation(Numbers[i]);
}
}
public IEnumerator<T> GetEnumerator() {
foreach(var v in Numbers) {
yield return v;
}
}
}
List<int> inumbers = new () { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
NumberList<int> ilst = new (inumbers);
Console.WriteLine(ilst.Sum());
ilst.Map((v)=>v*v);
foreach(var v in ilst) {
Console.Write($"{v},");
}
Console.WriteLine();
List<double> dnumbers = new () { 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0 };
NumberList<double> dlst = new (dnumbers);
Console.WriteLine(dlst.Sum());
dlst.Map(Math.Sqrt);
foreach(var v in dlst) {
Console.Write($"{v.ToString("0.0000")},");
}
Console.WriteLine();
結果はこんな感じ
55
1,4,9,16,25,36,49,64,81,100,
5.5
0.32,0.45,0.55,0.63,0.71,0.77,0.84,0.89,0.95,1.00,