将每个T转换为IEnumerable <igrouping <,>&gt;到IGrouping&lt;,&gt; </iggrouping <,>

时间:2014-06-01 04:04:31

标签: c# linq generics

我的代码中收到IEnumerable<T>。它可以是非分组的,平坦的IEnumerable<T>或分组的。{/ p>

因此,我使用我写的微小,漂亮的小扩展来检查这是否是:

public static bool IsABunchOfGroups<T>(this IEnumerable<T> source)
{
  return typeof(T).IsAssignableFrom(typeof(IGrouping<,>));
}

然而,一旦选中,如果它是IEnumerable<IGrouping<,>>,我想将其投射到那里,以便将IEnumerable<T>中的每个T转换为IGrouping&lt;,&gt;我不知道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
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

为什么不呢:

Collection.Select(item => (TheTypeYouWant)item);