gpt4 book ai didi

c# - 检测 IEnumerable 是否已分组,我在检查类型时得到了一些疯狂的结果

转载 作者:太空狗 更新时间:2023-10-30 00:20:47 25 4
gpt4 key购买 nike

因此,我试图弄清楚传递给我的方法的一些随机 IEnumerable 是否已分组。我的想法是我将以不同的方式处理分组数据。我的问题是 IGrouping<>是一个不实现非通用接口(interface)的通用接口(interface),无论出于何种原因我都无法使用 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 Framework 中的错误吗?

上述结果怎么可能?


编辑:Jon Skeet 的回答是正确的......作为对其他发现自己遇到同样困难的人的礼貌,以下代码完成了检查 IEnumerable 是否分组或不是(基于 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

最佳答案

在 .NET 4 下,结果不仅是可能的,而且是预期的 - 在 .NET 3.5 中,由于缺少通用方差,最终结果将为 False。

同时 IGrouping<out TKey, out TValue> TKey 中都是协变的和 TValue , KeyValuePair<Tkey, TValue> 是一个结构,因此不能以协变方式使用。

所以IGrouping<string, string>是一个 IGrouping<object, object> ,而是一个 IGrouping<string, KeyValuePair<int, string>>不是。

不是框架中的错误。至于如何找出某物是否实现了IGrouping<TKey, TValue>对于一些 TKey, TValue对,你可以自己努力工作,或者使用 dynamic尝试提供帮助:

// 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");
}

请注意,这当然不是万无一失的 - 但它可能足以满足您的需求。

关于c# - 检测 IEnumerable<T> 是否已分组,我在检查类型时得到了一些疯狂的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9119738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com