【C#】Enumerable.OfType<TResult>(IEnumerable) メソッド

OfType<TResult>

配列やリストなどのシーケンス内に、指定した型に変換できる要素を取得する。


public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source)
{
    if (source == null) throw Error.ArgumentNumm("source");
    return OfTypeIterator<TResult>(source);
}

static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source)
{
    foreach (object obj in source)
    {
        if (obj is TResult) yield return (TResult)obj;
    }
}

 

自作クラスで確認


internal abstract class MyElement : IEnumerable<MyElement>, IEnumerable
{
    internal List<MyElement> children;
    
    internal MyElement()
    {
        this.children = new List<MyElement>();
    }
    
    public IEnumerator<MyElement> GetEnumerator()
    {
        foreach (var child in children) yield return child;
    }
    
    IEnumerator IEnumerator.GetEnumerator()
    {
        return ((IEnumerable)children).GetEnumerator();
    }
}

internal class MyTableRow : MyElement
{
    internal void AddChild(MyElement myElement) this.children.Add(myElement);
}

internal class MyTableCell : MyElement
{
}

internal class MyTableRowProperty : MyElement
{
}

internal class Dummy : MyElement
{
}

static void Main()
{
    var tr = new MyTableRow();
    tr.AddChild(new MyTableCell());
    tr.AddChild(new MyTableRowProperty());
    tr.AddChild(new MyTableCell());
    tr.AddChild(new MyTableCell());
    tr.AddChild(new MyTableRowProperty());
    
    var tcs = tr.OfType<MyTableCell>();
    System.Console.WriteLine(tcs.Count()); // 3
    var trPrs = tr.OfType<MyTableRowProperty>();
    System.Console.WriteLine(trPrs.Count()); // 2
    var dummys = tr.OfType<Dummy>();]
    System.Console.WriteLine(dummys.Count()); // 0
}