【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
}