岸原オカルト研究部

プログラミングを勉強していくブログです

自分用 C#のLINQ周り全部書く

自分用 C#LINQ周り全部書く

素敵な夜ですね。
C#勉強中なので自分用にLINQを纏めました。

LINQとは

デリゲード

まずデリゲードという記法について記述する。

配列arrayと数字nを受け取り、arrayで値がnとなっている要素の個数を調べるメソッドを考える。

public long Count(long[] array,long n){
	long x = 0;
	foreach(long y in arr){if(y==n※1) x++;}
	return y;}

全角※1の部分を引数にしたい。これを可能とするのがデリゲード。

public delegate bool Del(long n){return n==42;};

public long Count(long[] array,long n){
	long x = 0;
	foreach(long y in arr){if(del(y) == true) x++;}
	return y;}

このDelとCountを

Judgement judge = Del;
var c = Count(array,judge);

だったり

var c = Count(array,Del);

と使う。

匿名メソッド

C#2.0から、Delメソッドを省略できるようになった。

public long Count(long[] arr,Predicate<long> predi){
	long x = 0;
	foreach(long y in array){if(predi(y) == true) x++;}
	return y;}
public void Main(){
	var c = Count(array,delegate(int x){return x == 42;});
}

Predicateは、任意の数の引数を取りBooleanを返すメソッド(へのデリゲード)を表す型。

ラムダ式

C#3.0で、匿名メソッドと似た記述を更に進化・簡略化して行えるようになった。

Predicate<int> predi = (int x) => {if(x == 42){return true;}else{return false;}};
var c = Count(array,predi);

上記コードの一行目がラムダ式。引数宣言の後、その後で評価を行う一種のメソッド。

そしてこれを更に簡略化する。言語機能上、わざわざ変数宣言する必要がない。

var c = Count(array,(int x) => {if(x == 42){return true;}else{return false;});

そしてこれを更に簡略化する。式はそれ自体がbool型の値とみなせる。

var c = Count(array,(int x) => { return x == 42;});

そしてこれを更に簡略化する。一つのラムダ式に一つの文しかない時は、中括弧とreturnとセミコロンが不要。

var c = Count(array,(int x) => x == 42);

そしてこれを更に簡略化する。型を推論してくれる為型の明示不要。引数が一つの場合は括弧の省略可。

var c = Count(array,x => x == 42);

つまり、ラムダ式の(左辺) => (右辺)は(引数宣言) => (returnを省略した評価値)である。

LINQ

そして、LINQとはLanguage Integrated Queryの略で、言語に統合されたデータ集合へのアクセス方法の事。
それ単体ではラムダ式とは全く関係がない概念。ラムダ式と一緒に使うと便利というだけ。

newlist = list.Where(x => x == 2); //便利

TIPS

ラムダ式でたまに見る気がするメソッド

・Exists
・FindAll 戻り値はList
・RemoveAll
・ConvertAll

LINQでたまに見る気がするメソッド

・Where(遅延)
・Select(遅延)
・Join(遅延)
・OrderBy/OrderByDecending(遅延)
・Reverse(遅延)
・First/FirstorDefault,Last/LastOrDefault(即時)
・Max,Min,Sum(即時)
・ToArray,ToDicitonary,ToList,ToLookup(即時)

戻り値について

遅延とカッコ書きされたLINQメソッドの戻り値はIEnumerable
一言でいうと特殊な状態となる。Foreachならそのまま使える。

即時実行、遅延実行について

LINQのメソッドは(言わば)値ではなく式を代入する遅延実行と呼ばれる挙動を示すものが多い。
恐らく、要素全体を変化させたりして再度返すものは遅延実行、要素から特定要素を取り出したり一意の値を導き出して返すものは即時実行に見える。
言い換えると、特定のLINQメソッドは毎回再評価される。

string[] array = {"a","b","c","ab","bc","ac"}
var li = array.Where(s => s.Length>1);

foreach(var s in li){Console.WriteLine(s);}

array[0] = "abc"

foreach(var s in li){Console.WriteLine(s);}

多分実行結果はab,bc,acとabc,ab,bc,acになる。

これを避けるにはToArray等で固定する。

string[] array = {"a","b","c","ab","bc","ac"}
var li = array.Where(s => s.Length>1).ToArray;

foreach(var s in li){Console.WriteLine(s);}

array[0] = "abc"

foreach(var s in li){Console.WriteLine(s);}

多分実行結果はab,bc,acとab,bc,acになる。


メリットがわからない。なぜ即時実行、遅延実行という概念が存在するのか? => ネットに発見できず

indexの値を引っ張るLINQ
long sumOfOdd = a.Where((b, index) => index % 2 != 0).Sum();
別言語でのLINQライブラリ

qiita.com


Ruby……LINQないですか? => なさそう

qiita.com




参考文献 アフィはありません

実戦で役立つC#プログラミングの定石&パターン
www.amazon.co.jp



現在岸原オカルト研究部では、黒魔術(C#)を研究しています。
twitter:@kisihara_c

他のオカルト研究↓
超インスタント競プロ環境構築 C# - 岸原オカルト研究部

都内天然温泉ログ(23区内、5件)


素敵な夜ですね。
私は温泉が好きです。都内天然温泉をまわったのでログを残します。

前提として、都内の温泉はほとんど塩系です。
ぽかぽかする代わりに、乾かしたら、汗をかいたあとほったらかしで乾かした時みたいにべとつきます。


志村坂上 さやの湯処

www.timesclub.jp


人口密度:中(ただし背中合わせのシャワー等狭い部分も)
泉質:普通の塩系
雰囲気:純和風で良し
フルーツ牛乳

駐車場はいっぱいでした。恐らく北東京の車ユーザーが遊びに来ているんだと思います。
若い層が非常に多かったです。
源泉かけ流しの湯船があり非常に温まらせてもらいました。

巣鴨 SAKURA

www.fashionsnap.com


人口密度:高(シャワーが混んでいるが、立って浴びるシャワーブースがあるなど数は多い)
泉質:普通の塩系 ぬる湯あり、いいです! 非常にいいです。ぬる湯はだいぶ前に味わったきりです。
雰囲気:和洋折衷の高級
おいしい飲むヨーグルト

若い層が非常に多かったです。
入浴料がとにかく高いです。


武蔵小山 清水湯

tokyosento.com


人口密度:激高 死ぬかと思いました
泉質:重炭酸ソーダ、ヨードの2種
シャワー:非常に貧弱
フルーツ牛乳

都内で温泉、しかも天然2種類は最高です。有馬温泉みたいです。
ただ狭くはないのに激混んでいます。
客層は地元のおっちゃんが多いです。


麻布 黒美水温泉 竹の湯

welcome-kitasenju.com


人口密度:高
泉質:塩系
シャワー:ちゃんと出るのと出ないのがある

狭く、小さな銭湯という感じです。
こっちも客層は地元のおっちゃんが多いです。

亀有 大谷田温泉 明神の湯

tokyoonsen.com


人口密度:中 広いです
泉質:強い塩系
雰囲気:和風で良好。霞外籠逗留記って感じです。

曜日割引あるようですが割引の日は混雑しているようです。
客層はいろいろでした。



この中だと明神の湯が各要素よく、リピートしたいです。
今回は23区近くを探索しましたが、山手線外にも数件興味があるので、今度またブログにします。



現在岸原オカルト研究部では、オカルト(温泉)を研究しています。
twitter:@kisihara_c

Console.WriteLineって書いてくれるスニペット


素敵な夜ですね。

VisualStudioでcswlって打ってTabを2回押すとConsole.WriteLineって書いてくれるスニペット
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>cswl</Title>
      <Shortcut>cswl</Shortcut>
      <Description>Code snippet for Console.WriteLine</Description>
      <Author></Author>
    </Header>
    <Snippet>
      <Declarations>
        <Literal><ID>value</ID><Default>answer</Default></Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[Console.WriteLine($value$);$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

.snippetファイルにしてツール→コードスニペットマネージャーで突っ込んで下さい。

参考文献

qiita.com



現在岸原オカルト研究部では、黒魔術(競技プログラミングC#)を研究しています。
twitter:@kisihara_c

他のオカルト研究↓
超インスタント競プロ環境構築 C# - 岸原オカルト研究部

超インスタント競プロ環境構築 C#

 素敵な夜ですね。

 C#の環境構築について、導入かつちょっとは戦える状態を検討しました。記述していきます。
 自分で見直す用の記事なので、書くことを選ばず導入知識全般書いて進行していきます。
 より具体的な勉強法や問題・手法等は後日の競プロ初学ログにて。


前提条件

 俺はAtCoderで緑になりたいです。
 長期的にはそれ以上にもなってみたいですが、現状それ以上は見ていません。
 諸事情・自身の興味によりC#を使います。


考えなければならないC#の弱点について



>・優先度付きキューが存在しない
>・ソートがすぐO(n^2)になって死ぬ
>・平衡二分木についていないとほぼ意味がないlowerbound等の機能がない



rian.hatenablog.jp


>long double
>UpperBound/LowerBound
>swap
>Priority Queue
>deque
>set/map の upperbound/lowerbound
>next_permutation
>pair
>#define
>数値であることを表す interface
ICPCで使えない
>AOJで使えない
>配列などの初期化がつらい
>実行時間がつらい
>使っている人があまりいない

 多すぎる!!!!!
 ただ、おそらく緑には関係ないので無視しました。


Visual Studioを導入

 VSCodeのほうがかっこいいので好きですが各種楽なのでVisual studioを使いました。




 こんなものを見つけました。最悪これで。
https://try.dot.net/
 by qiita.com



Atcoderに登録

 省略


Atcoder problemを利用

https://kenkoooo.com/atcoder#/table/

 問題方針が固まったのはABC41~との事。それ以前は無視しました。


テンプレート

 毎回ベタ打ちは辛いです。
 C#erの方のコードを継ぎ接ぎさせていただいた、オリジナル度0のテンプレートを用意しました。
 プロジェクトを作りProgram.csをすべて書き換えて使えます。


// ABC999999999999

    using System;using System.Collections.Generic;
    using System.IO;using System.Linq;
    using static System.Math;using System.Text;
    using System.Threading;using System.Globalization;
    using System.Runtime.CompilerServices;using Lib.Util;
    using System.Numerics;
     
    public class Program
    {

        //1の時だけ文字入力待ちが発生。VSのデバッグ用にたまに使う。
        const int DEBUG = 0;
        ////////////////解いている問題を入れる↓
        public static void Problem() { ProblemA(); }
    
    
        //各問題のコード
    
        public static void ProblemA()
        {
            var sc = new Scanner();
            char c = sc.NextChar();
            
            Console.WriteLine(answer);
        }

        public static void ProblemB(){
            var sc = new Scanner();

        }

        public static void ProblemC(){
            var sc = new Scanner();
            
        }
     
        
        public static void Main(string[] args){

            //出力速度UP①
            var sw = new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
            Console.SetOut(sw);

            //冒頭の定義に従い各問の関数呼び出し
            Problem();

            //出力速度UPConsole.Out.Flush();
                
                
            //Visual Studio上のデバッグ用。DEBUG定数が1の時のみ動作。
            if (DEBUG == 1){
                Console.ReadKey();
            }
            
            if (args.Any())
                Console.ReadKey();

        }
        
    }
    

    namespace Lib.Util{
     
        //以下全て借り物
        class Scanner
        {
            private string[] _line;
            private int _index;
            private const char Separator = ' ';
     
     		//コンストラクタでindexを0に、lineを配列に初期化
            public Scanner()
            {
                _line = new string[0];
                _index = 0;
            }
     
     		
            public string Next()
            {
                while (_index >= _line.Length)
                {
                    _line = Console.ReadLine().Split(Separator);
                    _index = 0;
                }
     
                return _line[_index++];
            }
     
            public int NextInt() => int.Parse(Next());
            public long NextLong() => long.Parse(Next());
            public double NextDouble() => double.Parse(Next());
            public decimal NextDecimal() => decimal.Parse(Next());
            public char NextChar() => Next()[0];
            public char[] NextChars() => Next().ToCharArray();
     
     		
            public string[] Array()
            {
                _line = Console.ReadLine().Split(Separator);
                _index = _line.Length;
                return _line;
            }
     
            public int[] Ints() => Array().Select(int.Parse).ToArray();
            public long[] Longs() => Array().Select(long.Parse).ToArray();
            public double[] Doubles() => Array().Select(double.Parse).ToArray();
            public decimal[] Decimals() => Array().Select(decimal.Parse).ToArray();
        }
        

        // 付け足していく
        class LittleMethods{
        
        
        
        }
        
        
        
    }



// thanks
// https://atcoder.jp/contests/abc171/submissions/14526247
// https://atcoder.jp/contests/abc171/submissions/14526315
// https://atcoder.jp/contests/abc171/submissions/14527040
// https://atcoder.jp/contests/abc171/submissions/14527118




 自分のソースではLib部分にちょこちょこ付け加える予定で、
 完成の暁はComproSimarmLibと名付ける予定です。
 Simarmはしまーむと読みます。可愛いですね。


www.pixiv.net
www.pixiv.net


 usingが多い? よくわからないんです

蓄積する

 その1。解いた問題には一行ずつコメントを付けていっています。
 コードを再利用しやすくするため。



 その2。使い回しが効きそうな部分は取り出して保存しようと思っています。

Visual Studio のスニペットを自作する方法 │ Web備忘録
VSCode でスニペットを自作する方法 │ Web備忘録

kisihara-c.hatenablog.com


 先述のC#の弱点についてはAtcoderProblemを解いていて必要な問題が出たら他の人の回答を拝見し拝借。
 え? 楽をするな? うるせ~知らね~
 FINAL FANT
 ASY


本文に書いていない参考文献 心よりお礼申し上げます。

rian.hatenablog.jp

qiita.com

qiita.com

他沢山




現在岸原オカルト研究部では、黒魔術(競技プログラミングC#)を研究しています。

本・論文レビュー(四冊、心理学、発達障碍関連)


 素敵な夜ですね。

 先日知人からの依頼があり発達障碍・発達障碍傾向が改善されうるのか数冊の本で調べました。
 せっかくなので記事にします。このブログは秘された事象ならどんな事でも探求します。
 結論から言えば、よくわかりませんでした。
 まず本をまとめ、その後に考察します。

 なお、病気でも故障でもないと考えているので治る・直るという漢字は使っていません。


自閉症スペクトラム 10人に一人が抱える生きづらさの正体(SB新書)

・「こだわり保存の法則」を提唱している。
 自閉症スペクトラムの方はこだわりの対象が薄くなっても、常に何かに対してこだわる。
 コンディションが悪ければ悪いほど、そのコダワリは狭くきつくなっていく。

・二次障碍への対策面から、「トップダウン」(独自の用法と思われる)の教育方針をオススメしている。
 トップダウンとは、「できないことはできないままでいい」という教育法。

・どんなに努力しても自閉症スペクトラムの症状がゼロになった自閉症スペクトラム持ちはゼロと主張している。
 IQの上昇も無関係。

・世間には「問題が発生しないと自閉症スペクトラムと診断できない」という医師もいるが、
 「華々しく問題(含むトラウマ)を解決しないと見栄えが悪い」という良くない意識の現れなのではないか。

「発達と脳(医学書院)」記載の論文

・脳のニューロンは報酬とドーパミンで強化される。
 幼少期に応用行動分析さえあれば、発達障碍保持者の欠点部分が、一般者とほぼ互角になる事もありうる。
 今後の動物実験の進歩を期待する、との事。

アスペルガーの人はなぜ生きづらいのか?(講談社

・「逆耐性現象」を提唱している。挫折によって弱くなる現象。二次障碍の事か?

アスペルガーの人は強迫性障碍を負いやすい。次に抑うつ。人格障碍との併存も有りえ正確な病名の特定は困難。
 アスペルガーの人と境界性人格障碍者との見分けがつかないことを「重ね着症候群」と言い、
 また極めて厄介なことに本当に併発している存在もいる。

・さまざまな形式の不適応とその対策について語られている。
 特に、「常識で考えれば当然の行為に対し、なぜこんなことをしなければならないのか」疑問に思う患者に対し、
 「これはこういった慣習である」と説明する等。

・「能力によるカバーを諦めるべきではない」という論調が強い。
 特に、「想像力の質が健常者と異なる」の欄。
 一般者だって、無人島に放り込まれたときや、複雑な概念を与えられた時(不得意分野に触れた時)、その想像力は硬くなるだろうと指摘。
 アスペルガー者も想像力を働かせることを諦めるべきではないとしている。
 また、「心」とは、他人の要求に答えることができた成功体験の繰り返しによってできる幻想に過ぎないと論じ、
 人類学者が精霊信仰の民の中に混じりいつしか精霊が見える事に例え、
 アスペルガー者も心を理解しようとする戦略を取れるという立場を取る。

・そして、「アスペルガー文化の確立」という、ある意味逆転的な提言も行っている。


広汎性発達障碍児への応用行動分析(二瓶社)

・応用行動分析とは発達障碍の軽快を狙う手法。

・あくまで応用行動分析は科学でなく手法・知恵とし、発達障碍はナオるか等の記述は見られない

・ただ、夜に起こしての排尿など、努力と工夫で発達障碍チリョウを行う実践的なノウハウが記述されている。
 あまりにうまくいく例ばかりなので、ひょっとしたら発達障碍は生後数年の教育でなんとでもなるのではないか、
 そんな気分になるが、きっとそうではないのだろうし、そういう内容の本でもない。

本のまとめ

 総合して考えれば、発達障碍は最新の科学ではナオる事もあるというのが正しいのではないのかと思われる。
 少なくとも、幼少期の脳が発達し続ける時期、
 人と触れ合い、その事で報酬を得続ければ、ナオるのではないかという見方はたしかにある。

 大人になってからはわからない。


最終的な謎

 また、最終的な謎がある。

「一般者が自閉系スペクトラムを持つ事はありうるのか?」。

 自閉系スペクトラム者が応用行動分析とドーパミンと報酬によって一般者と同様の神経回路を手に入れるのなら、
 一般者がドーパミンと報酬によって自閉系スペクトラム者と同じような神経回路を手に入れる事もありうるはずだ。
 そういった症状を示す方をここで仮に偽自閉系スペクトラム者と呼ぶ。

 偽自閉系スペクトラム者は自閉系スペクトラム者とも一般者とも馴染めず社会に溶け込めない。
 だが、訓練によって一般者と変わらない脳の能力を得ることができる。

 「自閉系スペクトラムは白黒ではなくグレー」とはよく言われるが、
 生来のグレーだけでなく、黒を塗りつけることで生まれるグレーはあり得るのだろうか、
 各者の対応のためにそこそこ重要な視点ではないかと思うがどうか。

 アルコール不耐症と同じだ。
 アルコールに弱いが克服可能な者にとっては、自分がそうであると理解できることは希望となる。
 逆に、本物のアルコールの不耐症者は、アルコールに弱いが克服可能な者によって被害を受ける。
 彼らは克服できてしまうからだ。

 アルコールの耐性の知識すら行き届いていない以上、
 自閉系スペクトラムについての知識が人口に膾炙する事はないだろうが。


まとめ


 結局大人がどうかについては謎な上、別の話が出てきて困りました。
 「最終的な謎」については、人体実験が必要になるはずですので、未来永劫判明することはないでしょう。

 「広汎性発達障碍児への応用行動分析」には、スペクトラム者に対し、
 体系だった手法でのふれあいを重ねた事で傾向が和らいだ症例が載っています。

 全て、大人になってからも間に合うのかどうか、識者に質問したいところです。



現在岸原オカルト研究部では、オカルト(心理学)を研究しています。
twitter:@kisihara_c

C#の仕様について所感


 素敵な夜ですね。

C#の仕様について面白かったこと

 まとめます。

Javaにそっくり(思想はそうでもない様子)
・配列の種類がいっぱい
・変数代入時型を明示
・参照型の変数有り注意

・アクセサ、プロパティ
・メソッドのオーバーロード
ラムダ式 無名関数のような構文で動く黒魔術
LINQ SQLのような構文で動く黒魔術


現在岸原オカルト研究部では、黒魔術(C#)を研究しています。
twitter:@kisihara_c

他のオカルト研究↓
https://kisihara-c.hatenablog.com/entry/2020/04/29/160204

オカルト研究部の名前の由来について、及び来栖川芹香ちゃんについて




 素敵な夜ですね。


 このブログは岸原オカルト研究部と言います。
 なぜオカルト研究部というかというと、20年以上前のゲーム「Toheart」の「来栖川芹香」というキャラに影響を受けています。

 プログラムと言えば黒魔術→黒魔術とはオカルト→Toheartの「来栖川先輩」と絡めよう
 という思考の流れでこのブログのタイトルが決定されました。

(あとは「西高科学部」というインディーズゲーム製作サークルにも影響されています)


20周年と聞いてwww.pixiv.net

コミケSP折綴じ本表紙予定www.pixiv.net


 ネットに上がっている、来栖川芹香ちゃんのファンアートです。
 可愛いですね。


 「Toheart」はマイナーなゲームなので、聞いたことがないと思います。
 (※PC版は18禁なのでご注意下さい)

 ただ、「Toheart」はオタク業界がまだまだ黎明期だった頃に作られたゲームです。
 極めて歴史が古く、現在の全ての「学園恋愛モノ」の始祖といってもあんまり怒られすぎない作品です。
 「Fateシリーズ」でいう「ギルガメッシュ王」のような存在です。
 (※本当はPCゲーム業界だけでもToheartより前の学園モノは存在します)

 Fateがまだ世の中に出たての頃、世界史・FF・深夜番組ファン以外は多分誰もギルガメッシュを知らなかったと思います。
 けれどそれでも、ギルガメッシュが世界の英雄の中で極めて古い英雄である事には変わり有りません。


 ヒロインの各キャラクターは、今見ると流石に洗練されていない印象を受けますが、その印象は順序が逆です。
 このゲームが出たことで、後追いでこのゲームのキャラに似た、もっと洗練されたキャラがたくさん出たのです。

 中でも来栖川先輩は可愛いです。
 このキャラクターは、主人公が通う学校でオカルト研究会に所属している先輩キャラです。
 無口でオカルト好きなお嬢様という設定は今見ても普通に琴線に触れます。
 イデアを感じます。


 プレイ中は「委員長かなーやっぱw」「マルチちゃん可愛いけど流石に精神が幼すぎて罪悪感がある」等
 色々思うところはありましたが、
 今Toheart関連で思い返すのは来栖川先輩の事ばかりです。


現在岸原オカルト研究部では、超常現象(オタクコンテンツ)を研究しています。
twitter:@kisihara_c