【解決方法】C# ienumerable.count() によって無効なキャスト例外が発生する


こんにちは、C# でまた奇妙な問題が発生しました。IEnumerable のメソッド “Count” と List の “Count” プロパティが InvalidCastException を発生させるというものです。 この問題についてはあまり明確ではないかもしれないので、例外が発生するコード部分を示します。

C#
int count = items.Count(); // The method raises an InvalidCastException

私が試したこと:

私の問題をグーグルで調べましたが、他の人にとっては、ある型から別の型にキャストしようとしているためにのみ問題が発生しますが、私にとっては、IEnumerable の Count メソッドと List の Count プロパティだけが原因です。
また、IEnumerable を List に変換してから、その Count プロパティを使用してみました。

C#
int count = items.ToList().Count // The property now also raises an InvalidCastException

最初はうまくいきましたが、その後はうまくいきませんでした。
IEnumerable を反復する以外に選択肢はないと思います。 IEnumerable に含まれる要素の数を取得するためだけに IEnumerable 全体を反復処理するよりも優れた解決策がある場合、これは非常に良いでしょう。
この問題にご注目いただきありがとうございます。

解決策 1

それは正しいです、 IEnumerable サポートしません Count 財産。 IEnumerable コレクションの反復のみをサポートします。

そのプロパティをサポートする型にキャストする必要があります。 の ICollection インターフェイス (System.Collections.Generic) Microsoft Learn[^] をサポートします Count 財産。

以下に例を示します。

C#
IEnumerable <string> names = new List<String>()
{
    "John",
    "Paul",
    "Ringo",
    "George"
};

ICollection<string> collection = names as ICollection<string>;

int count = collection.Count;

Console.WriteLine(count);

出力は次のとおりです: 4

解決策 2

それは私が得たものではありません:

C#
List<string> itemsAsList = new List<string> { "one", "two", "three" };
IEnumerable<string> items = itemsAsList;
int count = items.Count();
Console.WriteLine(count);
count = items.ToList().Count;
Console.WriteLine(count);
count = items.ToList().Count();
Console.WriteLine(count);
count = itemsAsList.ToList().Count;
Console.WriteLine(count);
count = itemsAsList.ToList().Count();
Console.WriteLine(count);
count = itemsAsList.Count;
Console.WriteLine(count);
count = itemsAsList.Count();
Console.WriteLine(count);

くれます

結果
3
3
3
3
3
3
3

それは私が期待していた通りです。
したがって、最初に行うことは、デバッガを使用して正確に何を行うかを調べることをお勧めします。 items が含まれています – 私はそれがあなたが考えているものではないと思います。

コメント

タイトルとURLをコピーしました