ゆるふわで雑な日記

Microsoft系の技術情報を中心にゆるふわに綴っていく予定です

Re:Microsoft MVP for Developer Technologiesを受賞しました。

TwitterやFacebookですでにお祝いのコメント等いただいているので、
ご存知の方もいらっしゃるとは思いますが、
本年もMicrosoft MVPを受賞しました。
詳しく知りたい方や、応募を検討されている場合は、
こちら(Microsoft MVP Award)のページを参照してみてください。

正直、昨年受賞したときは、
「来年はないな」と思ったりしましたが、 何とか今年も受賞することができました。 登壇する機会を与えていただいたイベント主催者の方や 参加者の方々等たくさんの方に支えていただいたお陰です。
更に1年MVPとして活動する機会を得ることができたので、
少しでも「誰か」の「何か」を提供できればと思っています。

↓ 一応昨年のエントリーも晒しておきます。
blog.relucer.net

2週間前のことを思い出したように書く

geekbar.doorkeeper.jp

↑で遊んできました。
まあ途中からはただ見守ってただけですが…

C#で書いてた方いたので、雑なC#版さらします。

※ 表示部分とテストはおまけです。
※ 周囲を囲まれた計算しか実装してません

github.com

IEnumerable<T>がnullまたはの要素の数が0個の場合を判定して処理を分岐したいときの話

どうしてますか?
って単純な疑問を提示するだけのエントリー

例えば、こんなやつ(Any()の結果を反転するパターン)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(!(foo?.Any() ?? false))
        Initialize();

    DoSometing();
} 

!とか出来たら使いたくない

例えば、こんなやつ2(Allするパターン)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.All(_ => false) ?? true)
        Initialize();

    DoSometing();
}

空集合に対するAllが必ずtrueなことを知らないと戸惑う + 直感的じゃない

例えば、こんなやつ3(数えたらいいじゃん)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if((foo?.Count() ?? 0) == 0) return;
        Initialize();

    DoSometing();
}

…無限のIEnumerableの時やばいね?

例えば、こんなやつ4(else使おうよ)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.Any() ?? false) 
    {
        DoSometing();
    }
    else
    {
        Initialize();
        DoSometing();
    }

}

…DoSometing();2回書いてる

例えば、こんなやつ4(else使おうよ2)

void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo?.Any() ?? false) 
    {
    }
    else
    {
        Initialize();
        DoSometing();
    }

}

…ifで実行されるの空じゃん

例えば、こんなやつ4(それっぽいメソッド作る)

sstatic class Extensions
{
    internal static bool IsNullOrEmpty<T>(this IEnumerable<T> target)
                                       =>  foo?.All(_ => false) ?? true;
}
void Hoge<T>(IEnumetable<T> foo)
{
    // fooがnullまたは空の時
    if(foo.IsNullOrEmpty()) 
        Initialize();

    DoSometing();
}

空集合に対するAllが必ずtrueなことを知らないと戸惑うけど名前付いた

他にもあるかもですが、どれが好きですか?
個人的には(たくさん書くなら)最後のやつかな

細かなお話

先日Twitterで、

Func<int,int> f = bool ? x => x + 1 : x => x -1;

Build できない的な話をしたりしました。 上のコードが Build できないのは、
x => x + 1x => x -1 の間に暗黙の変換がないからなんですが、 x => x + 1 単体でも型は不明(Action<T>なのか、Func<T,RT>なのかは人が見てもわからないしユーザー定義の delegateを含めると可能性は無限大)

いや、左に型書いてあるじゃんって思いますよね?
C#的には左辺の型を右辺に適用することは基本的にありません(でした)。

// そう、こいつが現れるまでは!!
int i = default;

まあ奴は 0 をセットしているだけなので構文解析的なコストはないのでやりやすい ってことで色々やってみた
C#

VB

scala

なるほど?C#もっと色々使って推論したら良いのにっていう人の気持ちもわかるし、
構文解析のコストが~っていう人の気持ちもわかる
(型推論とか禁止なって人の気持ちはあまりわからない) まあ、このケースに対して何か変化があるかどうかは知らないけど、C#の将来のバージョンアップ(8.0くらい?)で左辺型推論入るらしいよ?

Xamarinとかよくわからない初心者がXamarinの勉強会でXamarinが全く出てこない話をしたという報告

タイトルに言いたかった事を残らず書きました。

イベントの詳細はこちら↓
jxug.connpass.com

開発ツールの勉強会でパラダイムの話はつらいかな?
と思ったけど、やっぱりつらかったなと(未熟さを痛感)…
抽象的な理論を話すのか、具体例を示すのか散々迷って、
どちらも話そうとした結果中途半端な話になってしまった…
まあ、聞いていただいた方が、いつの日か「そういえば…」
なんてことになってくれたら幸いです。