てくメモ

trivial な notes

2023-04-01から1ヶ月間の記事一覧

ひとりアドベントカレンダーもどきの感想と索引

個人的なメモをせっかくなのでインターネット上に置いてみようと思いつきで始めた連続投稿。 アドベントカレンダーよろしく25日続けての感想、プラスその索引の記事。 感想 索引 感想 事前 ・既にメモとしてコードと、比較などした場合はその結果が手元にあ…

【C#】LINQ to Objects は難しそうで難しくない、けれどちょっと難しい、と思う

C#

ポエム寄り。LINQ(LINQ to Objects)は、宣言的な記述によりリーダビリティが高くて堅牢、書き味がよく、覚えればシーケンスとみなせるなら広く適用しうる守備範囲を持っている。 コツを押さえれば難しくない、大切な概念はコレ、といった記事もたくさんあ…

【C#】バイト列→16進数文字列、int→2進数文字列

C#

N進数文字列への変換のなかではやりたいがちな2種について。 まずはバイト列→16進数文字列。 ちなみに、需要が高いのか以下のようなガイドがある。 16 進文字列と数値型の間で変換する方法 - C# プログラミング ガイド - C# | Microsoft Learn まずBitConver…

【C#】String.Join 的なことを InterpolatedStringHandler を使ってやってみる

C#

【C#】文字列補間 - てくメモ 上記記事において、文字列補間は現在InterpolatedStringHandlerによってパフォーマンスチューニングがなされていることに触れた。 そのなかでは標準のDefaultInterpolatedStringHandlerを前提としていたが、InterpolatedStringH…

【C#】文字列補間

C#

C# の文字列補間($"[{i}, {j}"]: こういうリテラルでやりたいようなこと)は、C#(.NET)の進化によって手筋が変わっている部分があるので整理する。 まず箇条書きなポイントとして、一定程度新しい環境を利用する場合 文字列補間のリテラルがString.Format…

【C#】多次元配列と Span

C#

多次元配列(int[,]のような配列)は、標準でAsSpan()が用意されていない。そのため通常では、配列全体を連続した領域のデータとみなしたSpanとして扱えない。列挙以外に全体を連続として扱える方法は C# ではない……? MemoryMarshal.CreateSpanを使う方法が…

【C#】クエリ式の推せるところ

C#

いわゆるLINQにおいては、メソッドによる記述以外にクエリ式による記述を行うことができる。 var seq = Enumerable.Range(1, 10); var index = 1; var odd = from num in seq where num % 2 == 1 select (index++, num); Console.WriteLine(string.Join(' ',…

【C#】配列の部分的なコピー

C#

【C#】配列のシャローコピー - てくメモ 上記の比較の際、念のため検索で下調べしたところ、.Skip(int).Take(int)が方法として紹介されている場合があった。 表現力のLINQ。 ところでこれは、Range導入後のC#であればTake(Range)によりSkip(int)を省くことが…

【C#】配列のシャローコピー

C#

いまさら配列のシャローコピー!? な感じがあるけれど整理。 きっかけはClone()を用いてコピーを取っているのを見たこと。 結果から言えば無知にもとづく認識だったのだけれど、Clone()は使わない方がよさそうと思っていた。 Clone と銘打ちながらジェネリ…

【C#】基本的なハッシュ値の組み合わせ

C#

C#での基本的なハッシュ値の組み合わせ手段については、 ① HashCode.Combineを使う ② ValueTupleを使う ③ 要素に素数を乗算する とされていると思う。これに細かな情報を足してみる。 ひとつめ。 ②は実質HashCode.Combine。例えばValueTuple<T1, T2, T3>.GetHashCodeは次</t1,>…

【C#】順列の列挙

C#

競プロっぽいイメージがあるけど、普通の世界でも使いたくなる順列の列挙について。C#での実装を検索すると様々あるが、Kzrnm氏のNextPermutation()、それをイテレーター化したPermutations()が良いと思った。 ac-library-csharp/StlFunction.cs at main · k…

【C#】Generic Math を試して測ってみる

C#

Generic Math とは、.NET 7.0 で登場したインターフェイスの静的抽象メンバーを利用したジェネリックな数値処理のコンセプト。 参考: 【Generic Math】 C# 11 での演算子の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 例として、順列の…

【C#】ジェネリック型引数でキャスト

C#

ある型をジェネリック型引数の型にキャストしたいというとき、objectを経由するという手筋がある。 private readonly struct WithBox<T> { public readonly double Value; public WithBox(double value) => Value = value; public T Convert() { if (typeof(T) </t>…

【C#】GeneratedRegex が速すぎる

C#

Youtubeの動画みたいな記事タイトル。でも速い。GeneratedRegexは .NET 7.0 から入ったソースジェネレーターによる正規表現。 今回は、ある単語を含む行を抽出することを考えてみる。まずは正規表現ではなく、StreamReaderを用いたもの。 // StreamReader re…

【C#】降順(逆順)ソートと Reverse()

C#

降順ソートを行う際にArray.SortしてからArray.Reverseを行っているコードを見たのをきっかけに整理。 最初は、上記手段ははじめから降順ソートを行うよりReverse()の処理が増えるぶんさすがに不利なのではという印象を受けた。 けれど、以前の記事でも触れ…

【C#】PeriodicTimer と Task.Delay

C#

.NETにはタイマー的なものがたくさんある。PeriodicTimerはそのなかでも非同期タイマーと呼ばれるもの。 WaitForNextTickAsyncメソッドを await する使い方ができる。 // IDisposable using PeriodicTimer timer = new(TimeSpan.FromSeconds(3)); // Cancell…

【C#】文字列を逆順にする

C#

文字列を逆順にする(「あいう」→「ういあ」みたいな意味)ときにLINQを使うというネタがある。 // string text; public string ReverseByLINQ() => new(text.Reverse().ToArray()); ネタというのは、LINQは分かりやすくて書きやすいけれどパフォーマンスと…

ループアンローリング

標準ライブラリでも用いられているループアンローリングについて。参考: Source Browser (リンク先:SpanHelpers.IndexOf<T>(MemoryExtensions.IndexOf<T>からの非SIMDの分岐で行くメソッド)) みなさんご存知 ―― のような書きぶりだけれど、IndexOf<T>の内部を見</t></t></t>…

【C#】デリゲートと関数ポインタ

C#

C#の関数ポインタは相互運用用? 単純にデリゲートに対して速くなったりしないだろうか?先に結論:しなかった 要素から Key を取るコレクションを考えてみる。 private abstract class MyCollectionBase<T> { public abstract int GetKeyMethod(T item); } pri</t>…

【C#】共変性と半変性 やさしく

C#

用語を知らない人でも利用したことのありそうな仕組みランキング上位(独自調べ)、共変性と反変性について。 備忘のイントロとしてやさしく [要出典] 整理。 継承関係を持つクラス。 private class Animal { } private class Cat : Animal { } 次のようなこ…