【C#】LINQのCastメソッドとOfTypeメソッドの違いとは

LINQとは

LINQ、ラムダ式に関しては下記の記事を参考ください。

【C#】LINQ

2021.02.21

【C#】ラムダ式

2021.02.21

今回は、LINQのCastメソッドとOfTypeメソッドの違いについて解説していきます。

 

Enumerable.Cast<TResult>(IEnumerable) メソッド

Castメソッドは、配列やリスト内の要素を指定した型に変換することができます

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.cast?view=net-5.0

 

Enumerable.OfType<TResult>(IEnumerable) メソッド

Oftypeメソッドも同様に、配列やリスト内の要素を指定した型に変換することができます

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.oftype?view=net-5.0

 

CastとOfTypeの違い

CastメソッドとOfTypeメソッドの違いとしては以下になります。

メソッド名 説明
Cast ・キャスト(変換)失敗時に例外が発生する
・nullでも例外が発生する
Oftype ・キャスト(変換)できない要素は除外され、例外が発生しない
・nullでも例外は発生しない

Castメソッド

using System;
using System.Collections.Generic;
using System.Linq;

namespace c_cast_oftype
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List<dynamic>() {"first", 2, "third", 4, "five" }; // dynamic型のリストを作成

            foreach (var num in number.Cast<int>()) // Castメソッドでint型にキャストする
            {
                Console.WriteLine(num);
            }
        }
    }

実行結果:

System.InvalidCastExceptionがスローされました

上記のように、Castメソッドではキャストできなかった場合に例外が発生してしまいます

 

OfTypeメソッド

using System;
using System.Collections.Generic;
using System.Linq;

namespace c_cast_oftype
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List<dynamic>() {"first", 2, "third", 4, "five" }; // dynamic型のリストを作成

            foreach (var num in number.OfType<int>()) // OfTypeメソッドでint型にキャストする
            {
                Console.WriteLine(num);
            }
        }
    }

実行結果:

2 4

上記のようにOfTypeメソッドを使用すると、キャストできない要素は除外され、例外が発生することはありません

 

まとめ

CastメソッドとOfTypeメソッドについて解説してきました。

同じようなメソッドではあるものの、例外の有無において大きな違いがあります。

システム開発において、例外が発生してしまうとシステムがダウンしてしまったり、余計な処理が増えてしまいます。

そのため、Castメソッドよりも例外が発生しないOftypeメソッドを使用することが望ましいかと思います。

 

おすすめ・参考書籍

■C#を学習し始めた方向け
やさしいC 第3版 (「やさしい」シリーズ)

1週間でCの基礎が学べる本

確かな力が身につくC「超」入門 第2版 (Informatics&IDEA)

■C#をある程度学習した方向け
基礎からしっかり学ぶCの教科書 改訂新版 (マイクロソフト関連書)

独習C 新版

Effective C 6.0/7.0