2017-01-01から1年間の記事一覧

IEnumerable<T> のランダムな要素を選択する

d.hatena.ne.jp 上の記事で紹介されている「要素全体をメモリに保持せずに、ランダムな要素を選択する」アルゴリズムが面白いです。 C# で書いてみました。 public static class Extensions { // source が空だったり、配列やリストの場合の対応は後述 publi…

インターフェース型の変数への代入と 3 項演算子を組み合わせるとコンパイルエラーになる

クラス A と、クラス B が IDisposable を実装しているとします。 そのときに、3 項演算子を用いて、以下のように書くことはできないようです。 class A : IDisposable { ... } class B : IDisposable { ... } // コンパイルエラーになる: There is no impli…

構造体を定義すると Equals が自動的に実装されるが、IEquatable<T> を実装した方がよい

方法: 型の値の等価性を定義する (C# プログラミング ガイド) | Microsoft Docs より: 構造体を定義すると、System.Object.Equals(Object) メソッドの System.ValueType オーバーライドから継承された値の等価性が既定で実装されます。 この実装では、リフレ…

Mono 5.0 と C# 7 の Local Functions, Tuples で遊ぶ

Mono 5.0 と C# 7 で遊びます。 Mono 5.0.0 Release Notes | Mono まずは、mono のアップグレード。 $ brew upgrade mono mono のバージョンの確認。 $ mono --version Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Wed May 31 14:47:54 BST 2017) C…

算術シフト、論理シフト

using System; class Program { static void Display(int n) { Console.WriteLine(" int {0,12} {1,32}", n, Convert.ToString(n, 2)); } static void Display(uint n) { Console.WriteLine("uint {0,12} {1,32}", n, Convert.ToString(n, 2)); } static voi…

関数から整数(int)を 2 つ返すとき、配列とタプルの速度差を調べる

int の配列を new するのと、タプルを生成するのとで速度に差が出るのか計測してみました。 using System; using System.Diagnostics; class Program { static int[] CreateArray(int a, int b) { return new[] { a, b }; } static Tuple<int, int> CreateTuple(int a,</int,>…

0 と 1 を交互に繰り返したいときは xor を使う

変数に格納されている整数値が、 0 のときは 1 を返す 1 のときは 0 を返す というように 0 と 1 を交互に繰り返したいときは、1 と xor するとできます。 $ csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> int a = 0; cshar…

文字列リテラルにダブルクォートを含める

文字列リテラルにダブルクォートを含めるには、次のようにします。 標準の文字列リテラルなら、バックスラッシュでエスケープします 逐語的文字列リテラルなら、ダブルクォートを 2 つ重ねます using System; class Program { static void Main() { Console.…