閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C#

WinFormsでデータバインディング

C#

Control.DataBindingsを使うと手軽にプロパティの連動などができるみたい。チェックボックスのチェックが付いているときだけボタンを有効にしたい時とかはこんな感じで。 button1.DataBindings.Add("Enabled", checkBox1, "Checked"); 実際にはちゃんとモデ…

Vanara (C#でWindows APIを呼ぶときに使えるラッパーライブラリ)

C#

C#でWindows APIを呼びたい、という時に使えるパッケージとしてWindowsAPICodePackがあるのですが、結構前から更新されておらず.NET 6プロジェクトで使いたい時に面倒でした。 WindowsAPICodePack とか 同名パッケージがたくさんある… ふとFilesというソフト…

Fluent Assertionsのソースを少し読んでみた

先日のエントリに書いた例ですが、 Add(1, 2).Should().Be(3); // => Expected Add(1, 2) to be 3, but found 2. これ、 Add(1, 2) の部分どうやって取ってるんだろう、と思ってソース読んでみました。StackTraceでそこまで取れるのかなぁと思ったんですが、…

FluentAssersions

Fluent Assertions 一時流行った(?)流れるメソッド的なアレでテストが書けるライブラリ。もしくはSpec的なやつ。最近のNUnitもこれに近い記法になるけど、冗長じゃないかな? と思っていたけどテストコードより、その結果が重要という感じみたい。失敗した時…

null合体演算子 ?? の優先順位

何も考えずに使ったらハマったのでメモ。 int? foo = null; (5 + foo ?? 0); // => "5"を期待したけど"0"になる これは: (5 + (foo ?? 0)); // => 5 と書きましょう。StyleCopで乗算や除算には問答無用で括弧を付けろと言われる環境なので油断していました(…

MSTestのCollectionAssertでdoubleの配列を比較する際に精度を指定したい

Assert.AreEqualは精度を指定できるメソッドがあるけれど、CollectionAssertにはないっぽい。まぁ、それはそうか。 // Assert.AreEqualのオーバーロード: public static void AreEqual (double expected, double actual, double delta); IComparerを引数にと…

BenchmarkDotNet

BenchmarkDotNetその名の通り、任意のプログラムのベンチマークを取るためのライブラリ。C#で書いたメソッドのパフォーマンスを計るのに、いちいちStopwatch.StartNewして…とかしなくてよくなります。メソッドを複数回実行してその平均を結果として出力する…

C#のRangeとIndex

C# 8.0 の新機能 - C# ガイド | Microsoft DocsC# 8.0で追加されたRangeやIndexによって、配列の一部の要素を参照したいときに以下のように書けるようになりました。Rubyっぽい。 int[] arr = {0, 1, 2, 3, 4, 5}; arr[^1].Dump(); // => 5 (最後の要素が取…

標準出力にバイナリを吐く(C#)

C#

byte配列を文字列に変換してprintする、みたいな筋の悪いことをやってはまっていたけれど、ConsoleからStreamを取ってきてそれに対してbyte配列をそのままWriteするだけでよかった。 using (var stream = Console.OpenStandardOutput()) { byte[] buffer = .…

WPFでデザイン時にのみDataContextを指定する

デザイン サーフェイス上のサンプル データとプロトタイプを作るためのサンプル データ - UWP app developer | Microsoft Docsに全部書いてある。特にUserControlなど作っているときに、ViewModelは外から設定されるのでDataContextは設定したくない、けどな…

MenuItemのソースをもうちょっと読んでみる

結局、 <MenuItem Header="{Binding Value}" HeaderStringFormat="{}{0}円"/> は <MenuItem Header="{Binding Value, StringFormat={}{0}円}" HeaderStringFormat="{}{0}円"> <MenuItem.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding ., StringFormat={Binding HeaderStringFormat}}" /> </DataTemplate> </menuitem.itemtemplate></menuitem></menuitem>

MenuItem.Headerに対してStringFormatが効かない

<MenuItem Header="{Binding Value, StringFormat={}{0}円}"/> みたいに書いてもStringFormatの部分が無視されてしまう。ググって見ると WPF binding with StringFormat doesn't work on ToolTips - Stack Overflow がヒットして、もしやと見てみたらMenuItemにもHeaderStringFormatプロパティがあってこちらを使うと良</menuitem>…

C#で配列の並び替え

C#

C++だとshuffle関数とかあるんですが、C#にはないようです。Shufflingが、OrderByの引数にGuidを渡してあげると一行で済んで良さそうです。Guidを乱数の代わりに使うというのは自分ではなかなか思いつかない発想で面白いですね。 array = array.OrderBy(_ =>…

C#で「ちょっと待ってから実行する」

C#

最近ようやくC# 6が使える環境になりました。ずっと3.0止まりだったので、急に世界が変わった気がします。で、表題の件。 Task.Run(async () => { await Task.Delay(ちょっと); 何か(); }) みたいな感じで良いんだろうか、と思ったけどDelayはTaskを返すので…

配列を任意の値で初期化(fill)したい

0で初期化するなら何の苦労もないのだけど、1とか10にしたいって時。C++ならstd::fillがあるので: int arr[5]; std::fill(arr, arr + _countof(arr), 10); と書ける。さらにstd::vectorには初期値をコンストラクタで指定できるから: std::vector<int> arr(5/*要素</int>…

NUnit2.6でTestCaseにint以外の整数を使う場合は整数リテラルで型を明示する必要がある

C#

[TestCase(1)] public void Test(ulong n) { // ... } などと書いた場合、整数を書くとintと認識されるので: Test(1), Failed: System.ArgumentException : 型 'System.Int32' のオブジェクトを型 'System.UInt64' に変換できません。 というエラーが出てテ…

C# 3.0(以降)で自動プロパティにブレークポイントを設定する

C#

C# 3.0から自動プロパティが実装され、フィールドの定義を省略できるようになりました。これはとても便利なのですが、getter/setterを書かないため、ブレークポイントが張れないという問題がありました。通常のプロパティでは下図のようにget/set内でブレー…

任意のディレクトリの下にあるファイルを再帰的に見に行く

C#

特定のディレクトリの下にあるすべてのファイルを再帰的に見たい、という場合、Directory.GetFilesメソッドに再帰オプションを指定すると良いようです。 // GetFilesの第三引数に SearchOption.AllDirectories を指定すると、サブディレクトリも再帰的に見て…

ExcelをC#で操作する

C#

Excelで何かしようと思ったらVBAを使うのが普通なのでしょうが、VBはあまり好きじゃないのです。POIを使えばJavaやScala等でもファイルを吐けますし、Win32OLEを使えばRubyや、あるいはPerlなどでも操作できますが、インテリセンスが使えるのでC#がお手軽じ…

シーケンスから重複した要素を取り除くには(Unique)

C#

配列やらリストから重複を除いて一意な値を取り出したいということはよくありますが、LINQではEnumerable.Distinctメソッドを利用すると一発で実現できるようです。MSDNのサンプルそのままですが: int[] arr = {21, 46, 46, 55, 17, 21, 55, 55}; var uniq =…

LINQでFizzBuzz

C#

超既出でしょうけれども気にせずに。自宅ノートがWindowsになりC#3.0が気軽に触れるようになったので、LINQも少しは覚えておこうかと、FizzBuzzを書いてみました。仕事ではまだまだC#2.0なので実践する機会は当分無さそうではありますが……。今回は上記のペー…

foreachで受け取る型に制限がない?

C#

class Program { interface IAnimal { } class Dog : IAnimal { public void say() { Console.WriteLine("ワン"); } } class Cat : IAnimal { } static void Main(string[] args) { IAnimal[] dogs = new IAnimal[1] { new Cat() }; foreach (Dog d in dogs)…

複数の配列をひとつのループで処理したい in C#

元ネタ : 複数の配列をひとつのループで処理したい - ベイダー日記定期的に欲しくなるので複数の配列を受け取って要素をひとつずつ返すようなメソッドを作りました。手元の環境はC#2.0で拡張メソッドなんてないので以下のようなメソッドをどこかのユーティリ…

インターフェイスと、インターフェイスの持つメソッドと同じシグネチャのメソッドを持つインターフェイスと無関係なクラスを結合する(?)

C#

昨晩NPlotのソースを読んでいて気付いたのですが、C#では以下のようなことができるみたいです。 namespace Test { public interface IHello { void Say(); } public class HelloBase { public void Say() { Console.WriteLine("Hello!"); } } public class H…

色んな型の配列をGenericsで操作する

C#

C#で配列中で最も大きな要素を得るためのメソッドを書いたときに、配列がintとdoubleとか複数の型を持っているといちいちオーバーロードしなきゃいけなくて面倒くさい! C++なら std::max_element でなんでも扱えるのに……。ということで少し考えてみた。intも…

別プロセスの実行結果を逐次取得する

非同期でfindstrを実行する文字列検索ツールの作成:CodeZine別プロセス(findstr)の実効結果をリアルタイムにリストボックスに追加するためにデリゲートを使用していますが、これは大げさなような(例として使いやすかったから使っているだけでしょうが)。こ…

C#でLoadLibraryを使用してアンマネージDLLを使用する

C#(.NET)でアンマネージDLLを使用するには、DllImport属性を使用するのが記述量も少なく、面倒なことを考えずに済むので一番楽だと思います。 [DllImport("user32.dll")] private static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaptio…

??演算子

C#

やばい今始めて知った。 return hoge != null ? hoge : foo; みたいなコードをResharperが強調していて、見ると「??演算子を使うといいよ」などと仰る。試しにQuick Fixしてみると以下のようなコードになった。 return hoge ?? foo; プログラミングMicrosoft…

匿名メソッドで引数を省略

C#

イベントに匿名メソッドを割り当てる時に、そのイベントの引数を使用しない場合は引数宣言を省略することができるらしい。 button.Click += delegate { /*...*/ }; Resharperに教えてもらいました。

dotTrace (.NET Profiler)

Performance and Memory Profiler - JetBrains dotTrace プロファイラって使ったことなかったんですけどこれすごいですね。ボトルネックになっている部分が一目でわかりました。すばらしい。おかげでパフォーマンスが90%向上したよ!(どれだけ遅かったんだ)と…