using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ClassSearch
{
    /// <summary>
    /// IEnumerable<親クラス>のオブジェクトリストの中から特定のIEnumerable<子クラス>を抜き出すサンプルコード
    /// OfType<T>メソッドを利用した例、LINQを利用した例、その拡張メソッド版と並べて書いた
    /// OfType<T>メソッドが一番シンプルで利用しやすい
    /// </summary>
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            List<Mother> childList = new List<Mother>();
            childList.Add(new Child("Test1", 12));
            childList.Add(new Mother(32));
            childList.Add(new Mother(48));
            childList.Add(new Child("Test4", 64));
            childList.Add(new Child("Test5", 128));
            childList.Add(new Child("Test6", 256));

            IEnumerable<Child> select1 = childList.OfType<Child>();  //クラスリストの中からChildクラスを抜き出す
            foreach (Child item in select1)
            {
                Console.WriteLine(item.Name);
            }

            IEnumerable<Child> select2 = from elem in childList let childElemnt = elem as Child where childElemnt != null select childElemnt;   //LINQを使った抽出
            foreach (Child item in select2)
            {
                Console.WriteLine(item.ID);
            }

            //上記のラムダ式版(letの部分はnew演算子でオブジェクト-プロパティを作っている。素直に上記のコードにした方が読みやすいと思う)
            IEnumerable<Child> select3 = childList.Select(item => new { ChildElemnt = item as Child }).Where(o => o.ChildElemnt != null).Select(o => o.ChildElemnt);
            foreach (Child item in select3)
            {
                Console.WriteLine(item.Name);
            }
        }
    }

    class Child:Mother
    {
        public string Name { get; set; }

        public Child(string name,int id):base(id)
        {
            Name = name;
        }
    }

    class Mother
    {
        public int ID { get; set; }
        public Mother(int id)
        {
            ID = id;
        }
    }
}
最終更新:2012年09月07日 21:43