C#のListのLINQの話
昨日Windows Phone 7 ハッカソン in 名古屋に参加してきました。
ハッカソンで作成したアプリケーションは簡易的な書籍の検索システムです。
昨日の段階では、ひとまずタブ区切りのテキストデータをデータソースとしました。
アプリケーションでやってることは以下の通り。
1)データ格納クラス、処理クラスを作成
2)処理クラスのコンストラクタでデータソースからデータを読み込み、
データ格納クラスインスタンスのリストを作成
3)処理クラスはデータ複数の検索メソッドを持ち、各検索メソッドはパラメータごとに
データ格納クラスインスタンスのリストからLINQで対象データを抽出する
たいしたことは一切やっていないのですが、2)のようなデータの扱い方は
データソースが何であれ応用できるのでなかなか便利だと思います。
備忘録の意味も込めてソースコードの一部を紹介します。
<処理クラスのコンストラクタ>
//------------------------------------------------------------------- // ファイルを読み込んでCommonDataクラスの配列を作成するメソッド // private void SetCommonDataList() { // データリストの初期化 commonDataList = new List<CommonData>(); // リソースの準備 var uri = new Uri(PATH, UriKind.Relative); StreamResourceInfo streamInfo = Application.GetResourceStream(uri); Stream stream = streamInfo.Stream; StreamReader dataReader = new StreamReader(stream); // ヘッダ読み込み string header = dataReader.ReadLine(); // データ読み込み while(dataReader.Peek() >= 0) { string buff = dataReader.ReadLine(); string[] buffs = buff.Split('\t'); CommonData tempCommonData = new CommonData(); tempCommonData.isbn10 = buffs[0]; tempCommonData.isbn13 = buffs[1]; tempCommonData.title = buffs[2]; tempCommonData.shuppansha = buffs[3]; tempCommonData.chosya1 = buffs[4]; tempCommonData.chosya2 = buffs[5]; tempCommonData.mainTag = buffs[6]; tempCommonData.subTag = buffs[7]; tempCommonData.gaiyou = buffs[8]; tempCommonData.biko1 = buffs[9]; tempCommonData.biko2 = buffs[10]; commonDataList.Add(tempCommonData); } }
<検索メソッド>
//------------------------------------------------------------------- // CommonDataクラスの配列を返すメソッド(すべて) // public List<CommonData> GetCommonDataList() { return this.commonDataList; } //------------------------------------------------------------------- // CommonDataクラスの配列を返すメソッド(メインタグ) // public List<CommonData> GetKomokuList() { List<CommonData> response = new List<CommonData>(); var q = from x in commonDataList group x by x.mainTag; foreach (var item in q) { response.Add(new CommonData(item.Key)); } return response; } //------------------------------------------------------------------- // CommonDataクラスの配列を返すメソッド(タイトルの一覧) // public List<CommonData> GetShosaiList(string mainTag) { List<CommonData> response = new List<CommonData>(); var q = from x in commonDataList where x.mainTag == mainTag select x; foreach (CommonData item in q) { response.Add(item); } return response; } //------------------------------------------------------------------- // CommonDataクラスの配列を返すメソッド(詳細) // public List<CommonData> GetShosaiData(string isbn) { List<CommonData> response = new List<CommonData>(); var q = from x in commonDataList where x.isbn10 == isbn select x; foreach (CommonData item in q) { response.Add(item); } return response; }
と、いうことで何が言いたいかというと、
なんかしらのデータソースから取得してきたデータをhogehogeしたいときは
自作したデータ格納用のクラスのリストにつっこんでLINQで処理すると楽だよね!
ってことでした。
Windows Phone 7 ハッカソン in 名古屋も実に楽しゅうございました♪
Windows Phone 7 ハッカソン in 名古屋(10/13)
http://atnd.org/events/32639