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