ワードプレスブログに例を載せてます。
月: 2020年4月
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Linq; namespace Chapter01All { static class LinqSampleSelect { public static double Nijyou(this double n) { return n * n; } static void Main() { double[] nums = { -10.0, 16.4, 12.125, 100.85, -2.2, 25.25, -3.5 }; var sqrRoots = from n in nums where n > 0 | n < 0 //where n > 0 //select Math.Sqrt(n); select Nijyou(n); foreach (double x in sqrRoots) Console.WriteLine("{0:#.##}",x); } } } |
本の内容は、コメントアウトしているようになってます。少しだけ変えて、拡張メソッドを使ってみました。Sqrtはn>0ですが、二乗の場合はマイアスでもプラスでもいいので、where n > 0 | n < 0としましたが、where nだけだとエラーです。Math.SqrtとNijyouは関数的には同じ値を持つということだと思います。
今更ですが、発熱外来開設へ
今日の地元紙で、ようやく発熱外来を開設へ動き始めたようです。これでようやく、感染を疑われる患者と一般の患者の分別が可能になりそうということです。まだ実施は先のようです。陸前高田の診療所へ感染したお医者さんが診療に来ていて、93人の患者さんを見たようですが、発熱した人は一人でPCR検査で陰性ということで、感染者は出なかったようです。ラッキーでした。いつまで感染者ゼロが続くんでしょうか?嬉しいような嬉しくないような気分です。
ワードプレスブログに例を載せてます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Linq; namespace Chapter01All { class LinqStringOrderby { static void Main() { string[] strs = {".com", ".net", "hsNameA.com","hsNameB.net", "test", ".network", "hsNameC.net","hsNameD.com" }; var netAddrs = from addr in strs //where addr.Length > 4 && addr.EndsWith(".net") orderby addr select addr; foreach (var str in netAddrs) Console.WriteLine(str); Console.WriteLine(); string[] s = netAddrs.ToArray<string>(); for (int i = 0; i < s.Length; i++) Console.WriteLine(s[i]); } } } |
前に出た例題ですが、文字列でorderbyを使ってみました。whereをコメントアウトしてます。最後に配列に入れてみました。配列に入ってないと心配です。”(-“”-)”
where句を用いると、データの絞り込みが出来るようです。結果を文字列の配列に変換して見ました。ワードプレスブログに例を載せてます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Linq; namespace Chapter01All { class LinqStringArray { static void Main() { string[] strs = {".com", ".net", "hsNameA.com","hsNameB.net", "test", ".network", "hsNameC.net","hsNameD.com" }; var netAddrs = from addr in strs where addr.Length > 4 && addr.EndsWith(".net") select addr; foreach (var str in netAddrs) Console.WriteLine(str); string[] s = netAddrs.ToArray<string>(); for (int i = 0; i < s.Length; i++) Console.WriteLine(s[i]); } } } |
絞り込んだデータを文字列の配列に変換して見ました。
var posNumsは変数を定義しているように見えますが、クエリの実行をしているようです。ワードプレスブログに例を載せてます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
using System; using System.Collections; using System.Linq; namespace Chapter01All { delegate ArrayList Ary(int[] ary, int x, int y); class LinqArray { static void Main() { int[] test = { 0, 5, 10, -5, 2, 7, -3 }; Ary aryOp = AryCreate; //デリゲート ArrayList ary = aryOp(test, -99, -1); OutAryList(ary); var NewAry1 = from n in test //LINQ where n < 0 select n; foreach (int x in NewAry1) Console.Write(x + ", "); Console.WriteLine(); var NewAry2 = from n in test //LINQ where n >= 0 select n; foreach (int x in NewAry2) Console.Write(x + ", "); Console.WriteLine(); int[] ans = NewAry2.ToArray(); //intの配列に変換するのだが… for (int i = 0; i < ans.Length; i++) Console.Write(ans[i] + ", "); Console.WriteLine(); test[2] = -10; foreach (int x in NewAry1) //これだけで再度実行する。 Console.Write(x + ", "); Console.WriteLine(); foreach (int x in NewAry2) //NewAry2は単なる配列でないようです。 Console.Write(x + ", "); Console.WriteLine(); } static ArrayList AryCreate(int[] ary, int a, int b) { ArrayList ans = new ArrayList(); for (int i = 0; i < ary.Length; i++) if (ary[i] >= a & ary[i] <= b) ans.Add(ary[i]); return ans; } static void OutAryList(ArrayList ary) { foreach (int x in ary) Console.Write(x + ", "); Console.WriteLine(); } } } |
二度目のクエリの実行に注意。単に配列を参照しているように見ますが。
独習C#第3版、P520 LINQとvar
LINQを使うときは、varを変数のタイプにすることの例が載ってました。確かに、便利そうですが、思わぬ落とし罠?に嵌まることもありそうです。例えば、intの数字をプリントしているように見えても、実際は違うようです。ワードプレスブログに例を載せてます。