【发布时间】:2014-06-01 04:04:31
【问题描述】:
我在我的代码中收到IEnumerable<T>。它可以是未分组的平面 IEnumerable<T> 或分组的。
因此,我使用我编写的小巧、漂亮的小扩展来检查这是否:
public static bool IsABunchOfGroups<T>(this IEnumerable<T> source)
{
return typeof(T).IsAssignableFrom(typeof(IGrouping<,>));
}
但是,一旦检查,如果它是 IEnumerable<IGrouping<,>>,我想将其转换为 IEnumerable<T> 中的每个 T 都转换为 IGrouping 我不知道泛型类型参数是什么IGrouping<,> 是。
我正在努力做到这一点。
所以,这就是我想要的:
void WriteSequenceToStream(IEnumerable<T> sequence)
{
if (sequence.IsABunchOfGroups())
{
foreach(var t in sequence)
{
// t as IGrouping<,>
}
}
}
再一次,不确定泛型类型参数是什么,我什至在这种情况下使用 dynamic 关键字是没有意义的:
void WriteSequenceToStream(IEnumerable<T> sequence)
{
if (sequence.IsABunchOfGroups())
{
foreach(var t in sequence)
{
// t as IGrouping<,>
dynamic element = t;
someTextWriter.WriteLine(element.Key);
foreach(dynamic item in element)
{
// Oh yeah, may be I could! Anyway, still
// is there a way I could do it without the dynamic keyword?
// I think I am asking a question I've asked in the past
// many times already, in one form or another
}
}
}
}
【问题讨论】:
-
您打算展平列表吗?如果不是,那么
IEnumerable<IGrouping<,>>中的所有组是否都具有相同的键类型和相同的数据类型?如果不是,那么您如何期望IEnumerable<IGrouping<,>>转换为IGrouping<,>。如果我没记错的话,您可能想要获取所有元素,无论是否分组,如果我理解不正确,请更正。 -
我不想将
IEnumerable<IGrouping<,>>转换为IGrouping<,>。我想将IEnumerable<IGrouping<,>>中的每个元素转换为IGrouping<,>。 -
由于您不知道键和元素的类型,我想知道您投到
IGrouping<,>的目的是什么?获得组的密钥甚至更多?我想由于类型未知,因此可以通过反射来实现演员阵容。我会在这里试一试,如果我有东西给你,我会回来。 -
不知道key的含义,知道key的value还有意义吗?无法追溯分组中使用了哪个实体/属性。
-
@GertArnold:你是对的。整个问题和情景毫无意义。发布问题后,我很快改变了我的设计。我只是保留了这个问题,因为现在我不知道该怎么处理它。