foreachでループのindexを取得して、さらに絞り込む
以下のサイトで、foreachでループのindexを取得する方法がのっています。
これだけでも十分便利なのですが、indexを取得しながらさらに絞り込むことが出来ます。以下のサイトからヒントを得てやってみました。
以前にも使った以下のクラスを手直しして用意します。
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を色々できる(読み取り専用とか、非表示とか)
ので重宝してます。