そのため、メソッドに渡されたランダムなIEnumerableがグループ化されているかどうかを調べようとしています。グループ化されたデータを別の方法で処理するという考え方です。私の問題は、IGrouping<>
非ジェネリックインターフェイスを実装していないジェネリックインターフェイスであり、何らかの理由でis
ステートメントでテストできないことです。
これをテストするために、ここに私のサンプルコードがあります:
var dict = new Dictionary<int, string>() {
{1, "Prime" },
{2, "Prime" },
{3, "Prime" },
{4, "Not" },
{5, "Prime" },
{6, "Not" },
{7, "Prime" },
{8, "Not" },
{9, "Not" },
{10, "Not" },
{11, "Prime" }
};
var grouped = from d in dict
group d by d.Value into gd
select gd;
Debug.WriteLine("IEnumerable<IGrouping<string, KeyValuePair<int, string>>>: {0}", grouped is IEnumerable<IGrouping<string, KeyValuePair<int, string>>>);
Debug.WriteLine("IEnumerable<IGrouping<object, KeyValuePair<int, string>>>: {0}", grouped is IEnumerable<IGrouping<object, KeyValuePair<int, string>>>);
Debug.WriteLine("IEnumerable<IGrouping<object, KeyValuePair<object, object>>: {0}", grouped is IEnumerable<IGrouping<object, object>>);
Debug.WriteLine("IEnumerable<IGrouping<object, object>: {0}", grouped is IEnumerable<IGrouping<object, object>>);
Debug.WriteLine("IEnumerable<object>: {0}", grouped is IEnumerable<object>);
出力は次のとおりです。
IEnumerable<IGrouping<string, KeyValuePair<int, string>>>: True
IEnumerable<IGrouping<object, KeyValuePair<int, string>>>: True
IEnumerable<IGrouping<object, KeyValuePair<object, object>>: False
IEnumerable<IGrouping<object, object>: False
IEnumerable<object>: True
したがって、グループ化されている値のタイプを知らない限り、グループ化されているかどうかをテストすることはできないようです。これは.NetFrameworkのバグですか?
上記の結果はどのように可能ですか?
編集:ジョンスキートの答えは死んでいた...私が持っていたのと同じ困難でここにいる他の人への礼儀として、次のコードはIEnumerableがグループ化されているかどうかを確認する仕事をしました(Mrに基づいて.dynamicキーワードを使用するというSkeetの派手なアイデア):
public static bool IsGrouped (dynamic test) {
return CheckGrouping(test);
}
static bool CheckGrouping(object o ) {
return false;
}
static bool CheckGrouping<TKey, TValue>(IEnumerable<IGrouping<TKey, TValue>> grouping) {
return true;
}
コードが上記と同じであると仮定します。
IsGrouped(dict); //false
IsGrouped(grouped); //true