所以我试图弄清楚传递给我的方法的任何随机 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
所以似乎除非我知道被分组的值的类型,否则我无法测试它是否被分组?这是 .Net 框架中的错误吗?
以上结果怎么可能?
编辑:Jon Skeet 的回答已经死了......作为对其他发现自己遇到同样困难的人的礼貌,以下代码完成了检查 IEnumerable 是否被分组的工作(基于 Mr . Skeet 使用 dynamic 关键字的奇思妙想):
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