.NET

dotnet-run-script

Node.jsではpackage.jsonにちょっとしたスクリプトを書いて、npm runで実行できるけど、同じことがdotnetでもやりたい。 dotnetコマンド標準ではサポートしていなかったけど、dotnet-run-scriptを使えばできた。 github.com まずはインストール。 dotnet new…

.NET MAUI の ListView でツリー表示

MAUI の CollectionView を使ってツリーを表示するために、 SelectedIndex を取得する添付ビヘイビアを作ったりして頑張ったが、ListView を使えばそんな努力不要だった。 tnakamura.hatenablog.com ListView には SelectedItemIndex プロパティがあるので、…

MAUI の CollectionView でツリー表示する方法(完成版)

以前、MAUI の CollectionView でアイテムをツリー表示してみた。 tnakamura.hatenablog.com これは期待通りに動いた。ただ、ツリーのノードを開閉するときに選択されたアイテムのインデックスが必要で、インデックスを取得する方法が O(N) なのが気がかりだ…

CollectionView の SelectedIndex を取得するビヘイビア

.NET MAUI の CollectionView には SelectedItem プロパティはあるけど SelectedIndex プロパティは無い。ItemsSource にセットしているコレクションから SelectedItem と同じインスタンスを検索すれば取得はできるけど、O(N) なので件数が増えるとツラくな…

C# で ARM テンプレート関数を使う

C# のプログラムで Azure Resource Manager のテンプレート関数が使いたかった。具体的には guid を。Azure.Deployments.Expression パッケージを使って実現できた。 www.nuget.org guid 関数を呼び出して、deterministic な GUID を生成するサンプルは次の…

C# で Azure SQL Databaseの長期バックアップ保有期間を変更する

Azure.ResourceManager.Sql を使って、SQL Database の長期バックアップも設定できる。 www.nuget.org 毎月 1 回目のフルバックアップを 2 ヶ月保有するように変更するサンプルは次の通り。 using Azure.Identity; using Azure.ResourceManager; using Azure…

C# で Azure SQL Databaseの自動バックアップ保有期間を変更する

Azure.ResourceManager.Sql を使って、SQL Database の PITR を設定できる。 www.nuget.org PITR の保有期間を 14 日間に変更するサンプルは次の通り。 using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Sql; using Azure.R…

C# で Azure Entra ID に登録されているアプリにロールを割り当てる

Azure.ResourceManager.Authorization を使えばできた。 www.nuget.org リソースの共同作成者を割り当ててみたサンプル。 using Azure; using Azure.Core; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Authorization; …

C# で Microsoft Azure の DNS ゾーンに A レコードを登録する

Azure.ResourceManager.Dns パッケージを使って DNS ゾーンを操作できる。 www.nuget.org A レコードを追加するサンプルコードは次の通り。既存のパブリックIPアドレスリソースのエイリアスにしている。 using Azure; using Azure.Identity; using Azure.Res…

C# で Microsoft Azure のパブリックIPアドレスを作成する

Azure.ResourceManager.Network パッケージを使う。 www.nuget.org パブリック IP アドレスが無ければ作成するサンプル。 using Azure; using Azure.Core; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Network; using …

A10 - Resort Hotel

atcoder.jp 左からと右からの累積MAX(?)を計算しておく。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var D = int.Parse(Console.ReadLine()!); var Q = new List<(int Left, i…

C# で Key Vault にシークレットを登録する

Azure.Security.KeyVault.Secrets を使えば、Microsoft Azure Key Vault にシークレットを登録できた。 www.nuget.org 以下サンプルコード。シークレットの取得もやってる。 using Azure.Identity; using Azure.Security.KeyVault.Secrets; var client = new…

C# で Microsoft Entra ID にアプリを登録する方法

Microsoft Graph SDK を使う。Azure SDK ではなかった。 www.nuget.org アプリが既に存在するか検索し、なければ登録するコードは次の通り。 using Azure.Identity; using Microsoft.Graph; using Microsoft.Graph.Applications.Item.AddPassword; using Mic…

B09 - Papers

atcoder.jp ABとCDが座標というのを理解していなくて、1まわり大きい面積を計算してしまっていた。実際に手計算して気付けたけど、結構嵌まってしまったな。 var N = int.Parse(Console.ReadLine()!); var A = new int[N]; var B = new int[N]; var C = new …

A09 - Winter in ALGO Kingdom

atcoder.jp 配列のインデックスが配列に格納されているような形なんで、ミスしてもなかなか気付かずハマった。配列の中身を出力するコードを一時的に足して、間違っていた箇所にようやく気付けた。 var HWN = Console.ReadLine()!.Split(' ').Select(x => in…

B08 - Counting Points

atcoder.jp 点の座標を二次元配列にプロットしてから、二次元累積和を計算。 x座標用のループ変数はx、y座標用のループ変数はyと名前付けしたら、混乱が緩和された気がする。 const int H = 1500 + 1; const int W = 1500 + 1; var N = int.Parse(Console.Re…

A08 - Two Dimensional Sum

atcoder.jp 回答する際の、配列のインデックス指定で混乱した。変数名にもうちょい工夫が必要だったな。 var input = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var H = input[0]; var W = input[1]; var X = new int[H, W]; …

B07 - Convenience Store 2

atcoder.jp 前の時間帯と比べて何人増減したかを計算して、次にその累積和を計算。 var T = int.Parse(Console.ReadLine()!); var N = int.Parse(Console.ReadLine()!); // 例えば0時から10時までの営業で、 // 5時から10時まで働く従業員がいた場合、 // B[…

A07 - Event Attendance

atcoder.jp 前日比を計算してから、前日比の累積和を計算。 var D = int.Parse(Console.ReadLine()!); var N = int.Parse(Console.ReadLine()!); // 前日比を計算 var B = new int[D + 2]; // 0 日目と D + 1 日目も含める for (var i = 0; i < N; i++) { va…

B06 - Lottery

atcoder.jp アタリとハズレの累積和をそれぞれ計算しておく。0 番目の累積和として 0 を追加しておくテクニックを使ってみた。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var Q…

A06 - How Many Guests?

atcoder.jp (R日目までの累積来場者数) - (L - 1 日目までの累積来場者数)を愚直に実装してみた。 var NQ = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var N = NQ[0]; var Q = NQ[1]; var A = Console.ReadLine()! .Split(' '…

B04 - Binary Representation 2

atcoder.jp 2進数を10進数に変換。 var N = Console.ReadLine()!; var answer = 0; for (var i = 0; i < N.Length; i++) { var m = Math.Pow(2, N.Length - 1 - i); if (N[i] == '1') { answer += (int)m; } } Console.WriteLine(answer);

A05 - Three Cards

atcoder.jp 3重ループだと時間切れになるので、2重ループで。 var input = Console.ReadLine()!.Split(' '); var N = int.Parse(input[0]); var K = int.Parse(input[1]); var answer = 0; for (var r = 1; r <= N; r++) { for (var b = 1; b <= N; b++) { v…

A04 - Binary Representation 1

atcoder.jp 10桁目から計算開始し、桁を下げていく。 var N = int.Parse(Console.ReadLine()!); var answer = ""; for (int i = 9; i >= 0; i--) { var m = Math.Pow(2, i); answer += (int)(N / m); N = (int)(N % m); } Console.WriteLine(answer);

B03 - Supermarket 1

atcoder.jp ただの 3 重ループだと商品が重複するので WA になる。商品が重複しない工夫が必要。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(int.Parse).ToList(); var answer = false; // 組み合わせなので、…

A03 - Two Cards

atcoder.jp N 使ってないけど、AC だったのでヨシ! var input = Console.ReadLine()! .Split(' ') .Select(int.Parse) .ToList(); var N = input[0]; var K = input[1]; var P = Console.ReadLine()! .Split(' ') .Select(int.Parse) .ToList(); var Q = Co…

B02 - Divisor Check

atcoder.jp LINQ 使わずに for で書いてみた。 var input = Console.ReadLine()!.Split(' '); var A = int.Parse(input[0]); var B = int.Parse(input[1]); var exists = false; for (var n = A; n <= B; n++) { if (100 % n == 0) { exists = true; break; …

A02 - Linear Search

atcoder.jp LINQ 便利。楽のし過ぎかも。 var input = Console.ReadLine()!.Split(' '); var N = int.Parse(input[0]); var X = int.Parse(input[1]); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)); if (A.Any(x => x == X)) { Consol…

B01 - A+B Problem

atcoder.jp 単純な足し算。 var input = Console.ReadLine(); var array = input!.Split(' '); var A = int.Parse(array[0]); var B = int.Parse(array[1]); Console.WriteLine(A + B);

A01 - The First Problem

atcoder.jp 言語に C# 11.0(.NET 7.07) が追加されていたので、C# で書く。 var N = int.Parse(Console.ReadLine()!); Console.WriteLine(N * N); トップレベルステートメントが使えるので、コードが短くなって良し。