C# 检测是否存在IEnumerable<;T>;是分组的,I';我在检查类型时得到了一些疯狂的结果
所以我试图弄清楚是否有一些随机的IEnumerable传递给了我的方法。我的想法是以不同的方式处理分组数据。我的问题是,C# 检测是否存在IEnumerable<;T>;是分组的,I';我在检查类型时得到了一些疯狂的结果,c#,.net,c#-4.0,igrouping,C#,.net,C# 4.0,Igrouping,所以我试图弄清楚是否有一些随机的IEnumerable传递给了我的方法。我的想法是以不同的方式处理分组数据。我的问题是,I分组是一个通用接口,它没有实现非通用接口,无论出于什么原因,我都不能用is语句测试它 var dict = new Dictionary<int, string>() { {1, "Prime" }, {2, "Prime" }, {3, "Prime" },
I分组
是一个通用接口,它没有实现非通用接口,无论出于什么原因,我都不能用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>);
下面是我的示例代码:
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>);
结果不仅是可能的,而且是在.NET3.5中的.NET4下所期望的,由于缺少通用方差,最终结果将是错误的
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>);
While在TKey
和TValue
中都是协变的,它是一个结构,因此不能以协变方式使用
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>);
所以i分组
是i分组
,而i分组
不是
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>);
这不是框架中的错误。至于如何确定某些东西是否对某些TKey,TValue
对实施i分组
,您可以自己非常努力地工作,或者使用dynamic
尝试帮助:
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>);
// Code as before...
dynamic dyn = grouped;
ShowGrouping(dyn);
private static void ShowGrouping<TKey, TValue>
(IEnumerable<IGrouping<TKey, TValue>> grouping)
{
Console.WriteLine("TKey = {0}, TValue = {1}", typeof(TKey), typeof(TValue));
}
private static void ShowGrouping(object notGrouped)
{
Console.WriteLine("Not a grouping");
}
//像以前一样编码。。。
动态dyn=分组;
显示分组(dyn);
私有静态分组
(IEnumerable分组)
{
WriteLine(“TKey={0},TValue={1}”,typeof(TKey),typeof(TValue));
}
私有静态void ShowGrouping(对象未分组)
{
Console.WriteLine(“非分组”);
}
请注意,这当然不是万无一失的,但它可能足以满足您的需要。谢谢!我尝试的第一件事实际上是针对分组或未分组的IEnumerable的扩展方法,但这并没有真正起作用。我没有想到要使用动态关键字。当我玩KVP、字符串和ints并与同事交谈时,我意识到这是一个结构问题。@blesh:
string
不是结构,而是类。再次感谢您!我已经编辑了我的问题,包括我是如何使用你对dynamic关键字的超级巧妙的使用来解决我的特定问题的。老实说,这是我第一次有理由使用它,说也奇怪。。。你是对的,字符串不是结构。这是因为我打字太匆忙了。@StephenMuecke:我想你是说grouped.GetType()
。。。但基本上这是脆弱的:1)它假设没有其他类型以该名称开头;2) 它假设分组将使用GroupedEnumerable
的一个实现细节,它甚至不是公共类型。我通常对使用类型名而不是类型本身来确定任何内容的代码持谨慎态度。
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>);