INumber<T>インターフェース

.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,

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください