佐々木屋

技術的なことから趣味まで色々書きます

最近ちょっと忙しい

最近ちょっと忙しい。 というか、1日24時間では足りなくなってきた。平日は仕事しているし、休日は何かと時間を取られる。 元々要領がいい方ではないので、時間を作るのが下手なのです。 このブログ開設のきっかけを作ってくれた二人のSさんへの忘れ物を…

ここがダメだよ!VB.NET⑤(静的クラスが無いのよ)

そうなんです。VB.NETには静的クラスが無いんです。「モジュールがあるやん?」と思った方。 VB.NETのモジュールがC#の静的クラスとよく混同されますが、残念ながら100%同じというわけではないのです。 呼び出し方 静的クラスの場合、メンバーの呼び出し…

デザインパターン

以下に一つでも当てはまる方は、プログラミング設計を少し勉強した方が良いかもしれません。・最初は問題ないが、だんだん読みづらいコードにある ・スパゲティコードになってしまう ・オブジェクト指向の恩恵を生かしきれていない ・コメントが無いとさっぱ…

GroupByメソッド③

GroupByメソッドはクラスコレクション以外、通常のarrayコレクションでも使用可能です。 List<string[]> lst = new List<string[]> { new string[]{ "1", "25", "5", "3000"}, new string[]{ "1", "31", "10", "4000"}, new string[]{ "2", "31", "98", "12800"}, new string[]{ </string[]></string[]>…

GroupByメソッド②

GroupByメソッドには複合キーを指定することも可能です。複合キーの指定の仕方は2通りあり、new(VB.NETはNew With)による匿名型で指定する方法とTuple.Createで指定する方法があります。 List<Uriage> lst = new List<Uriage>() { new Uriage{KaisyaCD="1",SyainCD = "25"</uriage></uriage>…

GroupByメソッド①

GroupByメソッドはLINQの中では少し特殊(私だけか?)で、単純なlistやarrayのようなコレクションでは利用しません。コレクションコレクションの中にコレクションが格納されているような場合の集計に非常に便利な機能となります。複雑な集計を簡単に書くこ…

SelectManyメソッド

単純な配列に対して処理する場合は、SELECTメソッドで処理できますが、配列に配列を持つようなコレクションは少し面倒です。例えば、 List<string[]> values = new List<string[]> {new string[] { "京都府", "京都市"}, new string[] { "奈良県", "奈良市"}, new string[] { "大</string[]></string[]>…

LINQによる遅延評価

イテレータによる遅延評価と同様で、LINQでも遅延評価を実装することが出来ます。例えば、単純に1秒待つメソッド関数があるとします。 private int testFunction(int v) { Thread.Sleep(1000); return v * 2; } Private Function testFunction(ByVal v As I…

判定メソッド(Any、All、Contains)

コレクションに対して、ある条件を満たすような要素が存在するかどうかを判定するメソッドです。以下のコレクションに対して実行してみます。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; Dim values As Integer() = {1, 9, 5, 6, 8, 6, 2, 5, 3} Anyメ…

無意味なスコープ

変数スコープは出来るだけ短くするとバグの発生を抑えることができます。 課題① 変数iはメソッドの最初の方に宣言されていますが、実際はfor文でしか使用されていません。 int i; //処理① for (i = 0; i <= 10; ++i) { //処理② } Dim i As Integer '処理① Fo…

インデックス付きSelectメソッド

コレクションの要素を処理する際、ナンバリングが必要なことがたまにあります。 通常であれば、以下のようにfor文を使ってナンバリングするのでしょうが・・・。 string[] values = { "京都", "奈良", "大阪", "兵庫", "滋賀", "和歌山" }; var res = new Li…

初めての回線トラブル

昨晩(3日)20時ごろから自宅のネットワークが全てダウンしました。嫁「楽天つながらんけど!(-。-)y-゜゜゜」嫁切れる。 とりあえず、電話を確認。異常なし。コールも出来る。ルータは生きてる。 うーん、IP電話が問題無いということは光回線は問題な…

NULLを考える①(NULLIF関数)

データベースを扱う上で必ずと言っていいほどお世話になる「NULL」さん。何もないという意味ですが、C#などのプログラミング言語に比べると、SQLのNULLは少し「できる奴」だと個人的には思います。ということで、NULLを扱う関数を全てではありませんが少し考…

集合メソッド(Union、Except、Intersect)

複数のコレクションに対して集合を提供します。 Unionメソッド(和集合) 2つのコレクションの和集合を返します。和集合とは、集合A、集合Bが定義されている場合、A又はBどちらか一方の集合に属する集合全体「A∪B」のことを指します。 string[] value…

取得メソッド②(Skip、Take、SkipWhile、TakeWhile)

コレクションの特定要素を取得する際に利用します。Selectメソッドの場合だとコレクションを上から順番に評価していきますが、予め取得したい要素の場所が決まっているような場合は走査が無駄になる場合があります。その場合はこれらのメソッドを活用します…

ガード節によるネスト防止

ステートメントをネストし過ぎると可読性が著しく低下します。逆に言えばネストが少なければ見やすくなるのです。 課題 以下のような数値をチェックするような関数を考えます。 private int test1(int x, int y, int z) { int res = 0; if (x < 0) { res = 1…

集計メソッド(Max、MIn、Average、Sum、Count)

数値コレクションの最大値、最小値、平均値、合計、コレクション数を取得することができるメソッドです。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; Console.WriteLine(values.Max()); Console.WriteLine(values.Min()); Console.WriteLine(values.Ave…

取得メソッド①(First、FirstOrDefaullt、Last、LastOrDefault)

Firstメソッドはコレクションの先頭を取得するメソッドです。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; Console.WriteLine(values.First()); Dim values As Integer() = {1, 9, 5, 6, 8, 6, 2, 5, 3} Console.WriteLine(values.First()) 1正直単体で…

Visual Studio 2019

docs.microsoft.com 先月の4月2日にVisualStudio2019が公開され、4月30日にバージョン16.0.3がリリースされました。そろそろ安定したかな?ということと、GWでまとまった休みもあったので、この機会に開発環境を2017から2019に乗り換えてみました。 …

Whereメソッド

Whereメソッドはコレクションに対して指定した条件に一致する要素を抽出します。例えば、適当な数配列があって、5以上の要素をListへ格納します。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; //従来の方法 List<int> res1 = new List<int>(); foreach(int v in v</int></int>…

型推論のススメ

以前型推論を説明しましたが、これが乱用されてしまうと問題になりそう、と思うのは正しい感覚です。ただし、時と場合によっては型推論は非常に有用ですので使える場面においては積極的に使っていこうじゃないか、というのが今回のテーマです。 Variant型で…

HTMLからのPOSTがASP.NETで受け取れない

久々に一人でハマった話。備忘として残しておきます。ひょんなことから、HTML(正しくはASP)からPOSTしてASP.NET側よりRequest.Formで値を取得していますが、突然空(nullではない)が返ってきて正しく取得できない状況になりました。 <form action="http://xxx.aspx" method="post"> <input type="hidden" name="SitenCD" value="5"> 通常であればReques</form>…

OrderByメソッド

OrderByメソッドはLINQのソート機能です。コレクションの要素を並べ替えることが可能です。昇順の場合はOrderByメソッド、降順の場合はOrderByDescendingメソッドを使用します。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; //昇順 var res_ask = values…

ここがダメだよ!VB.NET④(「=」の意味)

C#の場合、単に「=」の場合は代入を表します。つまり、下記のコードは変数xに1を代入します。 x = 1; では、等価の意味はというと、「==」のようにイコールを重ねます。 if (x == y) { //~ } このように等価と代入が異なる演算子として用意されています。し…

型推論

暗黙的に型付けする変数のことを型推論と言います。C#はvarキーワードを利用します。 //通常の書き方 TestClass cls = new TestClass(); //型推論 var cls = new TestClass(); VB.NETはDimキーワードのみにしてAs以降の型を指定しないと型推論となります。 '…

Selectメソッド

LINQで一番利用されている(と思う)Selectメソッドです。コレクションの全要素に対して処理が行われます。例えば、適当な数値のコレクション全要素に対して3を掛けるような処理を考えてみましょう。 int[] values = { 1, 9, 5, 6, 8, 6, 2, 5, 3 }; //従来…

LINQを始める前に・・・

LINQを始める前にいくつか基礎知識として情報を紹介しておきます。 SQLとの関連 LINQ to Objectにおいて、構文がSQLと似ていますが、SQLと一切関係はありません。例えば、 int[] values = { 1, 2, 3, 4, 5 }; var q = from x in values where x % 2 == 0 ord…

三項演算子の有効活用

課題 例えば以下のような処理を考えます。 bool syoriFlg = true; string naiyo = ""; if (syoriFlg ) { naiyo = "hoge"; } else { naiyo = "piyo"; } Dim syoriFlg As Boolean = True Dim naiyo As String = "" If syoriFlg Then naiyo = "hoge" Else naiyo…

ラムダ式の基本

LINQの話をする前にラムダ式を説明しておきます。ラムダ式(lambda expression)自体は関数型言語で良く使われる機能の一つですが、デリゲートやLINQを利用した際のメソッド引数部分をより簡潔に記述できるようにとC#3.0(VB.NET9)から導入されました。ラム…

ポリモーフィズム(インターフェース)

インターフェースでポリモーフィズムを実現します。 インターフェースはクラスの規程のみを定めたものとなる為、抽象クラスと同様にポリモーフィズムを比較的容易に実現することが可能です。継承の時と同じように、何かメッセージを表示する共通メソッドをイ…