2016-01-01から1年間の記事一覧
GetEnumerator() を定義すると、foreach でループを回すことができます。 using System; using System.Collections; using System.Collections.Generic; class Program { static IEnumerable<int> G() { yield return 1; yield return 2; } static IEnumerator<int> T(</int></int>…
プロパティでコルーチンを定義するサンプルです。 using System; using System.Collections.Generic; using System.Linq; class Test { public IEnumerable<int> G { get { int n = 0; while (true) { yield return n++; } } } } class Program { static void Mai</int>…
やろうとしたこと List<T> の最後の要素を取得するメソッドが欲しい Enumerable.Last メソッドがある だけど、シーケンスを辿るので O(N) で遅いのでは? 先に結論から言うと、IList<T> インターフェース を実装しているなら、 Enumerable.Last は O(N) ではなく O</t></t>…
using System; class Program { static void Main() { var a = Tuple.Create(1, 2); var b = Tuple.Create(1, 2); Console.WriteLine(a == b); // False Console.WriteLine(a.Equals(b)); // True } } 実行結果です。 False True タプルを Dictionary のキー…
両方の Dictionary に同じキーが含まれる場合は、Sum() で足し合わせます。 using System; using System.Collections.Generic; using System.Linq; class Program { static Dictionary<int, int> Add(Dictionary<int, int> a, Dictionary<int, int> b) { return a.Concat(b).GroupBy(e => e</int,></int,></int,>…
using System; using System.Collections.Generic; using System.Linq; class Program { static IEnumerable<int> ZeroOne() { int n = 0; while (true) { yield return n; n ^= 1; } } static void Main() { Console.WriteLine(string.Join(",", ZeroOne().Take(</int>…
Python の >>> [(i, j) for i in range(3) for j in range(3)] [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] のような各ペアを求める Pairs 関数を作成してみました。 using System; using System.Collections.Generic; using…
Array.Clear メソッドは、1 次元配列だけでなく、2 次元配列もクリアすることが出来ます。 using System; using System.Collections.Generic; using System.Linq; class Program { static void Display(int[,] ary) { for (int i = 0; i < ary.GetLength(0);…
using System; using System.Diagnostics; class Program { [Conditional("TEST")] static void Foo() { Console.WriteLine("FOO!"); } static void Main() { Console.WriteLine("BEGIN"); Foo(); Console.WriteLine("END"); } } 実行結果です。 $ mcs -defi…
using System; class Foo { public void Say() { Console.WriteLine("Foo!"); } } class Bar { public Bar(int n, string s) { Console.WriteLine("n:{0} s:{1}", n, s); } public void Say() { Console.WriteLine("Bar!"); } } class Program { static void…
using System; using System.Collections.Generic; using System.Linq; class Program { static int ToInt(string s, int[] map) { int x = 0; foreach (var c in s) { x = 10 * x + map[c]; if (x == 0 && s.Length > 1) return -1; // leading zero } retu…
using System; using System.Linq; class Program { static void Main() { var ss = new[] { "foo", "bar", "baz" }; // 文字列の配列を文字のシーケンスにする var cs = ss.SelectMany(e => e); Console.WriteLine(string.Join(" ", cs)); // => f o o b a …
シーケンスに含まれる要素の出現回数を求める Frequencies メソッドを作ってみました。 using System; using System.Collections.Generic; using System.Linq; static class Ext { public static Dictionary<T, int> Frequencies<T>(this IEnumerable<T> xs) { var d = new</t></t></t,>…
CompositeDisposable クラスの Dispose メソッドを呼び出すと、CompositeDisposable に格納されている全ての要素に対して Dispose メソッドが呼ばれます。 CompositeDisposable クラスの Dispose メソッドを呼び出すと、IsDisposed プロパティは true となり…
シーケンスの最後の要素を取り除く Butlast メソッドを作ってみました。 using System; using System.Collections.Generic; using System.Linq; public static class Ext { public static IEnumerable<T> Butlast<T>(this IEnumerable<T> xs) { bool first = true; T </t></t></t>…
初期値と「次の値」を返す関数を引数で受け取り、無限シーケンスを返す Iterate メソッドを作ってみました。 using System; using System.Collections.Generic; using System.Linq; class Iter { public static IEnumerable<T> Iterate<T>(T init, Func<T, T> next) { T </t,></t></t>…
using System; using System.Collections.Generic; using System.Linq; public static class Ext { public static T MinBy<T, U>(this IEnumerable<T> xs, Func<T, U> key) where U : IComparable<U> { return xs.Aggregate((a, b) => key(a).CompareTo(key(b)) < 0 ? a : b); </u></t,></t></t,>…
比較関数を渡せる GroupBy メソッドを作ってみました。 using System; using System.Collections.Generic; using System.Linq; class Program { static IEnumerable<T[]> GroupBy<T>(IEnumerable<T> xs, Func<T, T, bool> match) { var ls = new List<T>(); foreach (var x in xs) { if</t></t,></t></t></t[]>…
1 次元配列を回転するサンプルです。 using System; using System.Collections.Generic; using System.Linq; class Program { static T[] Rotate<T>(T[] xs, int n) { var ret = new T[xs.Length]; if (ret.Length == 0) return ret; int m = n % ret.Length; f</t>…
インスタンスが null の場合にメソッド呼び出しを行うと、System.NullReferenceException 例外が生成されますが、拡張メソッドの場合は、インスタンスが null でも呼び出しが可能です。 using System; public class Foo { public void Hello() { Console.Wri…
シーケンスの要素を、述語関数を満たす要素と満たさない要素に分割する Partition 関数(メソッド)を作ってみました。 using System; using System.Collections.Generic; using System.Linq; class Program { static Tuple<List<T>, List<T>> Partition<T>(IEnumerable<T> xs, </t></t></t></list<t>…
シーケンス内の隣り合う要素のうち、同じ値のものを配列にまとめる関数 Group を作ってみました。 using System; using System.Collections.Generic; using System.Linq; static class Iter { public static IEnumerable<T[]> Group<T>(IEnumerable<T> xs) { var ls = n</t></t></t[]>…
R, C が与えられたとき、それぞれの格子点が対角線のどちら側にあるか判定するプログラムです。 対角線の傾き (R-1)/(C - 1) 格子点の傾き i/j について、その大きさを比較します。もし傾きが等しければ格子点は対角線上にあることがわかります。 等しくなけ…
ラムダ式の再帰呼び出しのサンプルです。 using System; class Program { static void Main() { Func<int, int> fact = null; fact = n => { if (n == 0) return 1; else return n * fact(n - 1); }; for (int i = 1; i < 10; i++) Console.WriteLine(fact(i)); } } 実</int,>…
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 という関数が定義されています。 たとえば 1, 3, 4 の数字を使って 4 桁の数を作るには、Python では itertools.product([1, 3, 4], repeat=4) と書くだけで実現できます。 配列を用意してバックトラックで桁を…
再帰で順列を作るサンプルです。 ABCD の順列をつくりたい A を除いた BCD で順列を作り、先頭に A を付けると A が先頭の順列ができあがる B を除いた ACD で順列を作り、先頭に B を付けると B が先頭の順列ができあがる C を除いた ABD で……(以下同様) 1 …
リストの要素から、ある特定のキーで最小の値を持つものを取得したい場合があります。 Ruby では、Enumerable#min_by メソッドを使うと、そのような要素を簡単に取得できます。 C# には、そのものずばりのメソッドは標準ライブラリにはないのですが、Enumera…