Listから条件に適応するものだけを抽出したい
皆さん
こんにちは、こんばんは
TomoProgです。
気がつけば2ヶ月ほどブログ更新していなかった!!
まぁいつもどおりあまり気にせず、ゆるく更新していきたいと思います。
今回はC#にて、List型から条件に適応するものを抽出するにはどうしたらいいのだろう?
ということで調べてみました。
それでは頑張っていきましょう。
素直にすべて走査して抽出する
Listの中身をすべて走査して、条件に合うものを抽出していきます。
using System; using System.Collections.Generic; namespace console { class Student { public string name { get; } public int score { get; } public Student(string name, int score) { this.name = name; this.score = score; } } class MainClass { public static void Main(string[] args) { List<Student> studentList = new List<Student>(); // リストに生徒を追加 studentList.Add(new Student("Tanaka", 60)); studentList.Add(new Student("Sato", 70)); studentList.Add(new Student("Aoki", 60)); // 70点未満の生徒のリストを作成 List<Student> selectedList = new List<Student>(); foreach (Student s in studentList) { if (s.score < 70) { selectedList.Add(s); } } // 作成したリストの内容を出力 foreach (Student s in selectedList) { Console.WriteLine("Name:{0} Score:{1}" , s.name, s.score); } } } }
実行結果: Name:Tanaka Score:60 Name:Aoki Score:60
Linqを使って抽出する
Listから条件に適応するものだけを抽出する際は、
LinqというC#独自の技術を使うと
先ほど書いたプログラムよりも圧倒的にキレイに書くことが出来ます。
using System; using System.Collections.Generic; using System.Linq; namespace console { class Student { public string name { get; } public int score { get; } public Student(string name, int score) { this.name = name; this.score = score; } } class MainClass { public static void Main(string[] args) { List<Student> studentList = new List<Student>(); // リストに生徒を追加 studentList.Add(new Student("Tanaka", 60)); studentList.Add(new Student("Sato", 70)); studentList.Add(new Student("Aoki", 60)); // 70点未満の生徒のリストを作成 var selectedList = from x in studentList where x.score < 70 select x; // 作成したリストの内容を出力 foreach (Student s in selectedList) { Console.WriteLine("Name:{0} Score:{1}" , s.name, s.score); } } } }
実行結果: Name:Tanaka Score:60 Name:Aoki Score:60
70点未満の生徒のリストを作成するところが先ほどのプログラムと違うことがわかると思います。
Linqを使えばSQL文を発行するようにList型から条件に適応するものだけを抽出することが出来ます。
まとめ
今日はListから条件に適応するものだけを抽出するということで、
2つの方法を紹介しました。
どちらの方法でも結果は同じですが、
Linqを使った方が綺麗にコードが書けて可読性も高まると感じました。
C#使うときは積極的に使っていこうと思います。
それではまた。
TomoProg
C#で見たことが無い型に遭遇した
皆さん
こんにちは、こんばんは
TomoProgです。
気がつけばもうすぐ6月も終わりですね。
今年も半分が過ぎようとしていると思うと早いものです。
最近ブログは週一ぐらいが自分のペースに合ってるなと思ってきました。
ですので、それぐらいのペースで更新していけたらなと思います。
それはさておき、
今回はC#で見たことの無い型を見つけたので、そのことについて書いていこうと思います。
それでは頑張っていきましょう。
戻り値の型がint?ってどういうこと!?
Xamarinを勉強するためにC#で書かれたサンプルコードを眺めていると以下の様なコードに遭遇しました。
static readonly string[] digits = { "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" }; static int? TranslateToNumber(char c) { for (int i = 0; i < digits.Length; i++) { if (digits[i].Contains(c)) return 2 + i; } return null; }
なんじゃこりゃ!?
戻り値の型がint?ってどういうこと!?
と心の中で叫んだ私はとりあえず調べてみることにしました。
int?型を使ってみる
本当にnullを許容できるようになるのか実際にコードを書いてみます。
using System; namespace console { class MainClass { public static void Main (string [] args) { int val = null; if(val == null) { Console.WriteLine("val is null"); } else { Console.WriteLine("val is {0}", val); } } } }
valがnullであれば"val is null"が表示されるはずですが、
コンパイルしてみると・・・
Error CS0037: Cannot convert null to `int' because it is a value type
nullからint型へ変換できないと言われてしまいました。
次にintに?を付けてみます。
using System; namespace console { class MainClass { public static void Main (string [] args) { int? val = null; if(val == null) { Console.WriteLine("val is null"); } else { Console.WriteLine("val is {0}", val); } } } }
これを実行すると、
val is null
nullを変数に入れる事ができ、正しく表示出来るようになりました!!
int?型を関数の戻り値として使ってみる
関数の戻り値でもint?型を使ってみたいと思います。
using System; namespace console { class MainClass { public static void Main (string [] args) { string str = string.Empty; char c = 'z'; str = "123456abcdef"; int? index = SearchIndex(str, c); if(index == null) { Console.WriteLine("'{0}' is not found", c); } else { Console.WriteLine("Index of '{0}' is {1}", c, index); } } private static int? SearchIndex(string str, char target_chara) { for (int i = 0; i < str.Length; i++) { if (str[i] == target_chara) { return i; } } return null; } } }
実行結果: 'z' is not found
文字列の中に対象文字が存在する場合はその位置を、存在しない場合はnullを返す関数を定義しています。
int?型を戻り値に指定することで、戻り値にnullを指定することが出来ました!!
まとめ
- int型に?を付けるとintの範囲値だけでなく、nullも許容できるようになる
intだけでなくdouble、float、char、boolなどに使用出来るみたいです。
初めて見た型だったので少しビビりましたが、nullが使えるようになると覚えておけばとりあえず大丈夫だと思ってます。
それではまた。
TomoProg
Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみた Part2
皆さん
こんにちは、こんばんは
TomoProgです。
Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみたPart2です。
前回でアプリのダウンロードまで終わったので、今回は実際に実機にインストールしてみたいと思います。
それでは頑張っていきましょう。
ダウンロードしたアプリをXamarin Studioで開く
Downloadボタンを押してアプリをダウンロードしたら、フォルダを開き、ソリューションファイル(.sln)をクリックします。
ソリューションファイルを開くと自動的にXamarin Studioが開きます。
iPhoneをPCと接続し、左上のDebugモード、Releaseモードを選べるところからRelease | iPhoneを選択します。
選択したらその横にある実行ボタンを押します。
ビルドに失敗する・・・
実機で動かす時が来たと言いたいところですが、実はこのまま実行すると・・・
Error: No installed provisioning profiles match the installed iOS signing identities.
プロビジョニングプロファイルがインストールされていないというエラーが表示され、実機にインストールが出来ません。
私自身iPhoneアプリに詳しくは無いので、プロビジョニングファイルの詳しい説明は出来ませんが、検索したところアプリケーションのメタ情報や作成者の署名などを書いておくファイルらしいです。
というわけで、プロビジョニングファイルを作成していきます。
プロビジョニングファイルを作成する
プロビジョニングファイルを作成するにはXcodeを使います。
Xcodeを開いたらFile->New->Projectを選択し、新しいプロジェクトを作成します。
プロジェクトはiOS用のプロジェクトであればおそらく何でも構いません。
適当にプロジェクトを作成したら、Bundle Identifierに書かれている内容を確認します。
次にXamarin Studioに戻り、Info.plistを開きます。
Info.plistのBundle Identifierを先ほどXcodeで確認したBundle Identifierに書き換えます。
これで実機にインストールする環境が整いました!!
実機でアプリを使ってみる
インストールする準備が出来たので、早速実行してみます。
実行すると接続しているiPhoneにインストールされます。
アプリを開くとToDoリストアプリが開きます。
実際に何かToDoリストに登録してみます。
Item nameにやることを入力して横の「+」ボタンを押すと登録出来ます。
AzureでToDoリストのテーブル内容を確認する
登録が出来たので、Azureからテーブルを見てみようと思います。
Azureにログインし、
App Service->作成したアプリ名->設定->Easy Table->TodoItem
を選択します。
選択すると先ほど登録したToDoリストが登録されていることが確認できます。
まとめ
今回は2回に分けてAzureを使ったXamarin.FormsアプリをiPhoneにインストールしてみました。
Azureを使うことでバックエンドをほぼ意識せず構築出来ました。
Xamarinを使うときはAzureの選択はありだと思います。
Azureの使い方も少し分かったところで、これからは自作アプリ作りに励もうと思います。
それではまた。
TomoProg
Azureを使ったXamarin.FormsアプリをiPhoneにインストールしてみた Part1
皆さん
こんにちは、こんばんは
TomoProgです。
Microsoft Azureと連携したXamarin.FormsアプリをiPhoneにインストールすることに成功したので、インストールまでの道のりを何回かに分けて書いていこうと思います。
Visual Studioを使っている人には申し訳ないですが、私がMacユーザーなので、Xamarin Studioを使うことを前提で書きます。
それでは頑張っていきましょう。
Xamarin Studioをインストールしよう
さてインストールのやり方は・・・
と言いたいところですが、ぶっちゃけますとほとんど覚えていません。笑
Microsoftエバンジェリストのちょまどさんのブログに超詳しく書いてあるので、ここを参考にすると良いと思います。
https://blogs.msdn.microsoft.com/chomado/xamarin/getting-started-xamarin-on-mac-for-free/blogs.msdn.microsoft.com
というわけで、
Xamarin Studioのインストールはちょまどさんに任せて次に進みましょう。笑
Microsoft Azureのアカウントを作成しよう
次にAzureのサービスを利用するためにAzureのアカウントを作成します。
アカウント作成にはクレジットカードが必要なので、準備しておきましょう。
azure.microsoft.com
Azureは本来は課金制ですが、無料で使える期間があるので、今回はそれを利用します。
Azureについて詳しく知りたい人はGoogle先生に聞いてみてください。
Microsoft Azureでモバイルアプリを作ろう
さてここまでかなり端折りましたがアプリ開発に入っていきましょう!!
まずは作ったAzureアカウントでAzureにログインします。
ログインしたら新規->Web + モバイル -> Mobile Appからモバイルアプリを作成します。
アプリ名は世界で唯一の名前にしないと設定できません。
リソースグループはとりあえずアプリと同じ名前に設定しておきました。
App Service プランは無料のものを選択しています。
作成すると自動でデプロイされるのでデプロイが完了するまで少し待ちます。
デプロイが完了するとこんな感じでメッセージが表示されます。
次にApp Service->自分が作成したアプリ名->設定->クイックスタートを選択します。
クイックスタートの検索バーでXamarinを検索し、Xamarin.Formsを選択します。
Xamarin.Formsを選択したらまずはデータベースを作成します。
Data Connections->Add data connection->データベース
から新しいデータベースを作成します。
データベースが作成出来たら、Data Connectionが出来るまでしばし待ちましょう。
Data Connectionが出来たらCreate a table APIのチェックボックスにチェックを入れ、Create TodoItem tableのボタンを押します。
TodoItemテーブルが完成したら、Downloadボタンからアプリをダウンロードします。
ここまででAzure側の設定はすべて終了です。
と同時に今日はここまでにしておきます。
次はXamarin Studioでのビルドから実機にインストールするまでを書いていこうと思います。
それではまた。
TomoProg
Xamarin使ってスマホアプリ開発をやってみようと思う Part0
皆さん
こんにちは、こんばんは
TomoProgです。
気がつけば5月が終わってしまいました。
時が経つのは本当に早いですね。
5月は何を作っていたのか振り返るとDjangoで掲示板を作成してましたね。
とりあえず、動くものを目指して作ったところ今回は挫折せずに動くものを作ることが出来ました。
PythonBoardという簡単な掲示板です。
http://ik1-326-23085.vs.sakura.ne.jp/PythonBoard/
まだまだ実装していない機能もありますが、次にやりたいことが出てきたので、そっちに移ろうと思います。
次にやりたいことって何よ?
それは・・・
最近Microsoftで話題のちょまどさんの影響でXamarinを使ったアプリ開発をやってみたいと思いました。
twitter.com
こんなアプリ作りたいなという構想はあるので、それを実現できるようなアプリを作っていこうと思います。
今日から頑張っていこう!!
それではまた。
TomoProg
Djangoを使って掲示板を作ってみる Part2
皆さん
こんにちは、こんばんは
TomoProgです。
久しぶりのDjangoを使って掲示板を作ってみるシリーズを書いていこうと思います。
それでは頑張っていきましょう。
完成した・・・?
こんな風に考えていたんです。
とりあえず、作りながら切りが良いときにブログ書いていくか。
そんなことを思いながら手当たり次第に作っていったところ、
キリがいいところってどこだよ・・・。
となって結局ブログをほぼ更新しませんでした。
しかし、とりあえず動くものを作るという目標は達成せねば・・・
というわけで、とりあえず動くものを作ってみました。
PythonBoardというPython関連のことについて話し合える掲示板です。
http://ik1-326-23085.vs.sakura.ne.jp/PythonBoard
Python関連のことに限定していますが、この記事を見ていただいた方は是非トピック立ててみたり返信してみたり、適当に使ってみてください!!
まだ追加したい機能がいくつかあるので、その時は機能ごとにブログを書いていこうと思います。
それではまた。
TomoProg
辞書型のKeyErrorを回避する
皆さん
こんにちは、こんばんは
TomoProgです。
久しぶりにブログ書こうと思います。
今回はPythonの辞書型を使っていると遭遇するKeyErrorについて少し調べてみました。
それでは頑張っていきましょう。
辞書型って何?
KeyErrorの前にまずは辞書型について少し書いておきます。
辞書型とは任意のキーに対して値を持てる型のことです。
他の言語でハッシュマップや連想配列という言葉を聞いたことがある人はそれとほぼ同じ型だと思います。
辞書型を使う場合は波括弧を使って「'キー':'値'」の形で表現します。
#-*- coding:utf-8 -*- def main(): person_dict = {'name':'tomoprog', 'age':24, 'blood':'A'} print(person_dict['name']) print(person_dict['age']) print(person_dict['blood']) if __name__ == "__main__": main()
実行結果: tomoprog 24 A
person_dictという変数に辞書型を定義し、「変数名['Key']」で定義した辞書型の値にアクセスしています。
ちなみに辞書型の値は数値でも文字列でも構いません。
KeyErrorを出力してみる
それでは今回の本題に入っていきましょう。
まずはKeyErrorを実際に起こしてみます。
とは言っても引き起こすのは簡単で、存在しないキーで辞書にアクセスするだけです。
実際にKeyErrorを引き起こしたコードがコチラ
#-*- coding:utf-8 -*- def main(): d = {'name':'tomoprog', 'age':24, 'blood':'A'} print(d['name']) print(d['age']) print(d['blood']) print(d['height']) if __name__ == "__main__": main()
実行結果: tomoprog 24 A Traceback (most recent call last): File "dict.py", line 11, in <module> main() File "dict.py", line 8, in main print(d['height']) KeyError: 'height'
heightという存在しないキーで辞書にアクセスしたためKeyErrorが出力されています。
KeyErrorを回避する
KeyErrorが出力されると強制的にプログラムが終了してしまいます。
強制的に終了されては困る場合はこのKeyErrorを対処しないといけません。
対処する方法としては
- 辞書にキーが存在するかを確認してからアクセスする
- try-exceptを実装する
この2つの方法が考えられます。
実際に2つの方法で対処してみましょう。
辞書にキーが存在するかを確認してからアクセスする
キーを確認してからアクセスする場合はinまたはgetを使用します。
inを使う場合はもし、キーが辞書にあればというif文を書くことでKeyErrorを回避できます。
#-*- coding:utf-8 -*- def main(): d = {'name':'tomoprog', 'age':24, 'blood':'A'} if 'age' in d: print(d['age']) else: print("d do not have 'age' key") if 'height' in d: print(d['height']) else: print("d do not have 'height' key") if __name__ == "__main__": main()
実行結果: 24 d do not have 'height' key
getを使う場合は辞書型.get()メソッドを使用します。
存在する場合は第1引数、存在しない場合は第2引数を返します。
#-*- coding:utf-8 -*- def main(): d = {'name':'tomoprog', 'age':24, 'blood':'A'} print(d.get('name', None)) print(d.get('height', None)) if __name__ == "__main__": main()
実行結果: tomoprog None
どちらかと言えばgetを使うほうがif文が必要ない分綺麗に書けそうです。
try-exceptを実装する
try-exceptを使用する場合はKeyErrorが出力される部分をtryで囲み、exceptでKeyErrorを捕捉します。
#-*- coding:utf-8 -*- def main(): d = {'name':'tomoprog', 'age':24, 'blood':'A'} try: print(d['height']) except KeyError: print("KeyError Exception.") if __name__ == "__main__": main()
実行結果: KeyError Exception.
try-exceptが実装されることで、KeyErrorが出力されたときも強制終了することなく実行できます。
まとめ
今回は辞書型のKeyErrorの回避方法として、いくつか例を上げてみました。
個人的にはgetを使う方法が一番綺麗に簡潔に書けるので好きです。
KeyErrorで詰まった時は是非参考にしてみてください。
それではまた。
TomoProg