redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

foreachでループのindexを取得して、さらに絞り込む

以下のサイトで、foreachでループのindexを取得する方法がのっています。

okazuki.hatenablog.com

これだけでも十分便利なのですが、indexを取得しながらさらに絞り込むことが出来ます。以下のサイトからヒントを得てやってみました。

devadjust.exblog.jp

以前にも使った以下のクラスを手直しして用意します。

public class Book
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public bool Unread { get; set; } // 追加
} 

以下のように、indexを取得しつつ、絞り込みが出来ます。

var list = new List<Book>
               {
                   new Book{ ID = 1, Title = "GitHub実践入門", Author = "大塚 弘記", Unread = false },
                   new Book{ ID = 1, Title = "「納品」をなくせばうまくいく", Author = "倉貫 義人", Unread = false },
                   new Book{ ID = 1, Title = "コンサルタントの秘密", Author = "G.M.ワインバーグ", Unread = true },
                   new Book{ ID = 1, Title = "ライト,ついてますか", Author = "G.M.ワインバーグ", Unread = true },
               };

foreach (var unreadResult in list.Select((b, index) => new { b, index }).Where(result => result.b.Unread))
{
    // 未読の書籍タイトルと、元リストのインデックスが取得できる
    Console.WriteLine("index = {0}, title = {1}", unreadResult.index , item.b.Title);

    // index = 2, title = コンサルタントの秘密
    // index = 3, title = ライト,ついてますか
}

これで例えば、

Windowsフォームで、DataGridViewとBindingSourceを使用して、Listと同期させている場合に、Listに含まれるオブジェクトのプロパティによって、DataGridViewのColumnやRowを色々できる(読み取り専用とか、非表示とか)

ので重宝してます。