C#

ディクショナリとLINQ

プログラミングC# 第6版 9.1.3 Dictionaryをクエリ式で処理します。以下実装例 using System; using System.Linq; using System.Collections.Generic; class Program { static void Main() { var hash = new Dictionary<string, int>(); hash["a"] = 1; hash["b"] = 2; ha</string,>…

ディクショナリ

C#

プログラミングC# 第6版 9.1 コレクションクラスのDictionaryの使い方です。任意のキーに対して任意の値を格納できる配列のようなデータを作れます。 using System; using System.Collections.Generic; class Program { static void Main() { var hash = new…

配列やListへ変換する

プログラミングC# 第6版 8.3.12 クエリ式で得られた結果を、時には配列へ変換したいこともあるでしょう。そういう場合にはToArrayを使います。 using System; using System.Linq; class Program { static void Main() { int[] nums = new int[] { 1,2,3,4,5,…

join句による連結

プログラミングC# 第6版 8.3.11 別のデータ同士を連結させることができす。join句はConcatのように全てを連結するのではなく、条件で指定したものだけを連結することができます。 using System; using System.Linq; class Foo { public int id; public strin…

集合演算子

プログラミングC# 第6版 8.3.10 Intersect演算子 配列同士の共通要素だけを返す using System; using System.Linq; class Program { static void Main() { int[] nums1 = new int[] {2,4,6,8}; int[] nums2 = new int[] {4,5,8,9}; var ret = nums1.Intersec…

値の重複チェックに便利なHashSet

C#

プログラミングC# 第6版 9.2 HashSetは値の重複がないコレクションです。例えばあるデータに対して処理を行うときに、重複してる値には処理をしたくないという処理を書く場合以下のようになります。 using System; using System.Collections.Generic; class …

group by句によるグループ化

プログラミングC# 第6版 8.3.4 データをグループごとにまとめます。以下実行例 using System; using System.Linq; class Foo { public int id; public string name; } class Program { static void Main() { Foo[] fooList = new Foo[] { new Foo() { id = 2…

Concat演算子による連結

プログラミングC# 第6版 8.3.3 データ同士を連結します。以下実行例 using System; using System.Linq; class Program { static void Main() { int[] nums1 = new int[] { 1,2,3 }; int[] nums2 = new int[] { 5,6,7 }; var ret = nums1.Concat(nums2); fore…

orderby句

プログラミングC# 第6版 8.3.2 ソートされたデータを返します。以下実行例 using System; using System.Linq; class Foo { public int id; public string name; } class Program { static void Main() { Foo[] fooList = new Foo[] { new Foo() { id = 5 , n…

OfTypeフィルタ演算子

プログラミングC# 第6版 8.3.1 OfTypeは指定した型のオブジェクトだけを抽出するフィルタです。以下実行例。 using System; using System.Linq; class Foo { public int fooId; } class Bar { public int barId; } class Program { static void Main() { obj…

LINQは遅延実行

プログラミングC# 第6版 8.2.3 クエリ式で得た値は、実際にforeach等でループするまではまだ実行されてない状態とのこと。というわけで動作確認。 using System; using System.Linq; using System.Collections.Generic; class Program { static IEnumerable<int> </int>…

let句

プログラミングC# 第6版 8.1.3 クエリ式の中で使用できる一時変数を定義するためのものです。まずはlet句を使わなかった場合の処理を見てみましょう。 using System; using System.Linq; // 数値チェッククラス class CheckNum { private int _num; public i…

LINQ演算子の独自実装

プログラミングC# 第6版 8.1.2 WhereやSelectを拡張メソッドに頼らずに独自に実装することでクエリ式として扱うことができます。 using System; using System.Linq; class Foo { public int id; public Foo Where (Func<Foo, bool> predicate) { return this; } public </foo,>…

初めてのLINQ

プログラミングC# 第6版 8.1 LINQです。クエリ式とも言うみたいです。一見すると何がなんだか良くわからない感じに見えますが、今までのC#の知識で十分読み解けそうです。ということでまずは一番シンプルなクエリ式の構文を見てみましょう。 using System; u…

反復処理の実装とyield文

C#

プログラミングC# 第6版 7.3.1.1 反復処理を独自に実装することが可能とのこと。これは説明が難しいので実装を見た方がわかりやすいかと思います。 using System; using System.Collections.Generic; class Program { static void Main() { foreach(int i in…

例外処理

C#

プログラミングC# 第6版 6.3.1 C#における例外処理のお話。C++にもありましたね。まずは基本の実装例です。 using System; class Program { static void Main() { try { Foo(); } catch(Exception e) { Console.WriteLine("catch実行:"+e); } finally { Con…

0除算の結果定数

C#

プログラミングC# 第6版 飛ばしていた例外の章について見ていきます。double型の0で0除算をすると以下のような出力が得られます。 using System; class Program { static void Main() { double i = 0.0; Console.WriteLine(0.0/i); Console.WriteLine(1.0/i)…

集約用Aggregate演算子

プログラミングC# 第6版 8.3.9 要素を全て使用して単一の値を返すための演算子です。例えば要素数を返すCount演算子や、全ての要素の合計値を計算するSumなどがそれにあたります。 using System; using System.Linq; class Program { static void Main() { i…

AnyやAllメソッドによる要素のチェック

プログラミングC# 第6版 8.3.8 Anyメソッドを使うことで、ある条件に合う要素が一つでも存在しているかどうかのチェックを行うことができます。 using System; using System.Linq; class Program { static void Main() { int[] nums1 = new int[] {1,3,5,7};…

全体から一部を取り出す

プログラミングC# 第6版 8.3.7 全部は必要なくて例えば先頭から3件だけ処理したいとかいう場合にTakeメソッドを使います。 using System; using System.Linq; class Program { static void Main() { int[] nums = new int[] {1,2,3,4,5,6,7}; // 先頭から3件…

Zipメソッドによるマージ処理

プログラミングC# 第6版 8.3.6 二つのデータを一つのデータにまとめます。Concatのように結合するのではなく、同じ要素で一まとめにするといった感じです。まぁ文章より実装を見た方が早いですね。 using System; using System.Linq; class Program { static…

Selectメソッドで添え字を得る

プログラミングC# 第6版 8.3.5.3 Selectメソッドを使い、反復処理中の添え字を得る。以下実装例 using System; using System.Linq; class Program { static void Main() { string[] strs = new string[] {"foo","bar","baz"}; // ラムダ式の第二引数に添え字…

複数のデータソースを使用する

プログラミングC# 第6版 8.3.5.2 複数のデータソースを処理する。fromをつなげて処理する感じですね。 using System; using System.Linq; class Program { static void Main() { int[][] nums = new int[][] { new int[]{1,2,3}, new int[]{10,20,30}, new i…

selectに匿名型を利用する

プログラミングC# 第6版 8.3.5 selectで取ってくるデータとして匿名型を利用する。匿名型は以前習いましたね。 using System; using System.Linq; class Program { static void Main() { int[] nums = new int[] { 1,2,3,4,5 }; // selectに匿名型を利用 var…

属性を自作する

C#

属性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 属性は自作することもできるようです。 using System; using System.Reflection; [AttributeUsage( AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = fa…

デバッグ時のみ出力したり関数実行したりする

C#

前回の記事でConditional属性について学んだので早速デバッグ用の関数を作ってみました。 -- lib/debug.cs -- using System; using System.Diagnostics; namespace MyLib { public static class debug { // デバッグ改行出力関数 [Conditional("DEBUG")] pub…

Conditional属性

C#

属性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 属性というものが出てきました。クラスやメソッド等に追加情報を与えることができる機能とのことです。「百聞は一実装にしかず」という諺もある通り、手を動かしてみましょう。色々な属性があ…

リフレクションを利用して文字列からクラス操作

C#

実行時型情報 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C リフレクションとはプログラム実行時にクラス等のメタデータを取り出したりなんかしたりできる機能みたいです。これだけだとなんのこっちゃわからないのですが、要するに文字列からイ…

インデクサー

C#

インデクサー - C# によるプログラミング入門 | ++C++; // 未確認飛行 C 配列の[]をオーバーロードできる機能です。定義の仕方はプロパティと似ています。 using System; class Class { public int[] data = new int[10]; public int this[int i] { set { da…

演算子のオーバーロード

C#

演算子のオーバーロード - C# によるプログラミング入門 | ++C++; // 未確認飛行 C C++と同様にC#にも演算子のオーバーロードがあります。定義の仕方もまぁほぼ同じですね。 using System; class Class { public int i; public Class (int i) { this.i = i; …