バイナリファイルの読み書き。PNG の縦横サイズを取得してみる

BinaryReader, BinaryWriter クラスを用いて、バイナリデータの読み書きを行うサンプルです。 using System; using System.IO; class Program { const string filename = "data.dat"; static void Read() { using (var reader = new BinaryReader(File.Open(…

インスタンスメソッドと静的メソッドに同じメソッド名をつける

インスタンスメソッドと静的メソッドのそれぞれに同じ名前を付けることが出来ます。ただし、メソッドの引数は異なるようにする必要があります。 たとえば、以下のサンプルコードでは、インスタンスメソッドと静的メソッドいずれも Hello という名前で定義し…

リストの連結

リストを連結させるサンプルです。以下の 2 通りの方法で書いてみました。 List.AddRange で要素を追加する Enumerable.Concat で二つのリストを連結する using System; using System.Collections.Generic; using System.Linq; class Program { static List<int> </int>…

Python の itertools.product を C# で作る(3 引数まで対応)

Python の itertools モジュールには product という関数が定義されています。 たとえば 1, 3, 4 の数字を使って 4 桁の数を作るには、Python では itertools.product([1, 3, 4], repeat=4) と書くだけで実現できます。 配列を用意してバックトラックで桁を…

再帰で順列をつくる

再帰で順列を作るサンプルです。 ABCD の順列をつくりたい A を除いた BCD で順列を作り、先頭に A を付けると A が先頭の順列ができあがる B を除いた ACD で順列を作り、先頭に B を付けると B が先頭の順列ができあがる C を除いた ABD で……(以下同様) 1 …

MinBy, MaxBy を Aggregate で代用する

リストの要素から、ある特定のキーで最小の値を持つものを取得したい場合があります。 Ruby では、Enumerable#min_by メソッドを使うと、そのような要素を簡単に取得できます。 C# には、そのものずばりのメソッドは標準ライブラリにはないのですが、Enumera…

Comparison<T> デリゲートの使い方

List<T> クラスの Sort メソッドは引数に Comparison<T> デリゲートを取ります。 Comparison<T> デリゲートの定義は次のようになっています。 public delegate int Comparison<in T>(T x, T y) Comparison<T> デリゲートのインスタンスを作成し、List.Sort メソッドを呼び出す</t></in></t></t></t>…

インスタンスメソッドを変数に格納する

インスタンスメソッドを変数に格納するサンプルです。 用途としては、いくつかのメソッドのうちからランダムなメソッドを呼び出したいときに、 一時的に配列に格納したいとき等に使います。 using System; class Test { public void Foo() { Console.WriteLi…

小町算

1□2□3□4□5□6□7□8□9 = 100 という数式の□の中に、+, -, 空白のいずれかを入れて、正しい数式を完成させるプログラムです。 using System; using System.Collections.Generic; using System.Linq; class Program { const int EMPTY = -1; // 空白 const int AD…

select 句を重ねるには into を使う。または let 句を使う

Enumerable.Select メソッドを複数呼び出している式を クエリ式に変換する方法です。 select 句の後ろに into を使う。するとクエリを継続できる。 let 句を使う。 using System; using System.Collections.Generic; using System.Linq; class Program { sta…

Enumerable.Cast<T> は int を long にキャストできない

Enumerable.Cast メソッドで、要素を int から long にキャストすることは出来ないようです。 $ csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> var xs = new[] { 1 }; csharp> xs.Cast<long>(); // System.InvalidCastException E</long>…

引数なしの Any() は、シーケンスが空でないかを判定する

Enumerable.Any() は、以下の 2 種類のメソッドが定義されています。 Enumerable.Any(IEnumerable) Enumerable.Any(IEnumerable, Func<T, Boolean>) 引数を取らないほうの Enumerable.Any() は、シーケンスが空でなければ true を、空であれば false を返します。 $ csha</t,>…

foreach ループをインデックス付きでまわす

using System; using System.Collections.Generic; using System.Linq; class Program { static IEnumerable<string> Three() { yield return "one"; yield return "two"; yield return "three"; } static void Main() { var xs = new[] { 4, 23, 9, -12 }; foreach </string>…

Scala の sliding メソッドを作成してみる

Scala には、sliding メソッドというのがあります。これを C# で実装してみました。 using System; using System.Collections.Generic; using System.Linq; static class Ext { public static IEnumerable<T[]> Sliding<T>(this IEnumerable<T> src, int size, int step</t></t></t[]>…

ネストしたループから抜ける

goto 文の練習。 using System; class Program { static void Main() { Console.WriteLine("BEGIN"); for (int i = 0; i < 10; i++) { for (int j = 0; j < 5; j++) { Console.WriteLine("i:{0} j:{1}", i, j); if (j == 2) { goto END; } } } END: Console.…

UTC とローカル時刻を表示する

using System; class Program { static void Main() { var utc = DateTime.UtcNow; var now = DateTime.Now; Console.WriteLine("utc now : {0}", utc); Console.WriteLine("utc now -> local : {0}", utc.ToLocalTime()); Console.WriteLine(" now : {0}", …

何度も実行される箇所で Linq を使うことによるパフォーマンスの影響

Project Euler 23 を解いていて、Linq 使用の有無で速度差が出たのでメモ。 約数の和を求める SumProperDivisors メソッドで Linq を使う場合と、Linq を使わずに for 文で計算する場合とでどれくらい速度に差が出るか計測してみました。 using System; usin…

ファイル名から拡張子を取り除く

Path.GetFileNameWithoutExtension メソッドを使うと、パス名から拡張子を取り除いたファイル名を取得することが出来ます。 using System; using System.IO; class Program { static void Main() { var ss = new[] { "name.txt", "name", "foo/name.txt", "/…

Linq: Select と Take の組み合わせ

xs.Select(処理).Take(N) と xs.Take(N).Select(処理) に違いがあるか気になりました。 つまり、欲しい値は N 個だけなんだけど、Select(処理) は xs の全ての要素に対して適用されるのだろうか。 using System; using System.Linq; class Program { static …

Unicode メモ

using System; using System.Collections.Generic; using System.Text; using System.Linq; class Program { static string Hex<T>(T b) { return string.Format("{0:X}", b); } static void Main() { string s = "𪚲"; // Unicode 2A6B2(D869+DEB2) // UTF8 F0</t>…

文字列の連結の速度比較: string.Join vs StringBuilder

文字列の連結の速度比較をしてみました。 List<string> クラスに文字列を格納し、string.Join() で文字列を連結する。 StringBuilder クラスに文字列を格納し、ToString() メソッドで文字列を生成する。 上記 2 通りの方法で速度を計測してみました。 using System; </string>…

Mono で Rx をはじめてみる

Rx

hotmiyacchi.hatenablog.com 上のブログ記事で紹介されている UniRx をみて、コマンドラインから Reactive extensions の練習がしたくなりました。 Mono で Rx をはじめるまでのインストール手順を書きます。 環境 OS X El Capitan 10.11.1 $ mono --version…

List<int> を List<long> に変換する

List<int> を List<long> に変換するサンプルです。 using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { List<int> list = new List<int>() { 1, 4, 120, -55 }; List<long> xs = list.Select(e => (long)e).ToList(); Console.</long></int></int></long></int>…

インスタンスが同一か確認する

Object.ReferenceEquals メソッドでインスタンスが同一かどうか確認することができます。 public static bool ReferenceEquals( Object objA, Object objB ) サンプル using System; class C {} struct S {} class Program { static void Same(object a, obj…

BigInteger を int に変換する

BigInteger を int へ変換するサンプルです。 // biginteger-to-int.cs using System; using System.Numerics; class Program { static void Main() { var bigint = new BigInteger(1234567); int n = (int)bigint; Console.WriteLine(n); } } 実行結果です…

リストの反転。List.Reverse と Enumerable.Reverse を呼び分ける

リストを反転するときの List.Reverse と Enumerable.Reverse を呼び分けるサンプルです。 $ csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> var xs = new List<int>() { 1, 2, 3, 4, 5 } csharp> xs.Reverse() // List.Reverse </int>…

Swap メソッド

値を Swap するメソッドです。 using System; class Program { static void Swap<T>(ref T a, ref T b) { var t = a; a = b; b = t; } static void Main() { int a = 1; int b = 2; Console.WriteLine($"{a} {b}"); Swap(ref a, ref b); Console.WriteLine($"{a</t>…

Mono: コンパイラオプションでシンボルを定義する

mcs コマンドの -define オプションでシンボルを定義することが出来ます。 // define.cs using System; class Program { static void Main() { #if DEBUG Console.WriteLine("DEBUG シンボルは、定義されています"); #else Console.WriteLine("DEBUG シンボ…

文字列を置換する。置換回数を指定する

string クラスの Replace メソッドによる文字列の置換は、マッチする全ての文字列が置換されます。 $ csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> var s = "abc abc abc"; csharp> s.Replace("abc", "def"); "def def def…

文字列の反転

文字列を反転させるプログラムです。 using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { string s = "hello"; var t = s.Reverse(); // Iterator が返されます Console.WriteLine(t); string s2 = …