【问题标题】:Cast each T in the IEnumerable<IGrouping<,>> to IGrouping<,>将 IEnumerable<IGrouping<,>> 中的每个 T 转换为 IGrouping<,>
【发布时间】:2014-06-01 04:04:31
【问题描述】:

我在我的代码中收到IEnumerable&lt;T&gt;。它可以是未分组的平面 IEnumerable&lt;T&gt; 或分组的。

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

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

但是,一旦检查,如果它是 IEnumerable&lt;IGrouping&lt;,&gt;&gt;,我想将其转换为 IEnumerable&lt;T&gt; 中的每个 T 都转换为 IGrouping 我不知道泛型类型参数是什么IGrouping&lt;,&gt; 是。

我正在努力做到这一点。

所以,这就是我想要的:

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&lt;IGrouping&lt;,&gt;&gt; 中的所有组是否都具有相同的键类型和相同的数据类型?如果不是,那么您如何期望IEnumerable&lt;IGrouping&lt;,&gt;&gt; 转换为IGrouping&lt;,&gt;。如果我没记错的话,您可能想要获取所有元素,无论是否分组,如果我理解不正确,请更正。
  • 我不想将IEnumerable&lt;IGrouping&lt;,&gt;&gt; 转换为IGrouping&lt;,&gt;。我想将IEnumerable&lt;IGrouping&lt;,&gt;&gt; 中的每个元素转换为IGrouping&lt;,&gt;
  • 由于您不知道键和元素的类型,我想知道您投到IGrouping&lt;,&gt; 的目的是什么?获得组的密钥甚至更多?我想由于类型未知,因此可以通过反射来实现演员阵容。我会在这里试一试,如果我有东西给你,我会回来。
  • 不知道key的含义,知道key的value还有意义吗?无法追溯分组中使用了哪个实体/属性。
  • @GertArnold:你是对的。整个问题和情景毫无意义。发布问题后,我很快改变了我的设计。我只是保留了这个问题,因为现在我不知道该怎么处理它。

标签: c# linq generics


【解决方案1】:

为什么不只是:

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

?

【讨论】:

  • 如果我错了,请纠正我,但我需要知道(并告诉编译器)我想要转换/投影成的封闭泛型类型的实际类型参数,对吗?所以,我不能写sequence.Select(item =&gt; (IGrouping&lt;,&gt;)item);可以吗?
  • 如果这是一个 T 问题(例如 CastToT (IEnumerable 集合)),您可以只转换为 T。(item => (T) item)
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2023-03-22
相关资源
最近更新 更多