IGrouping的实现类是什么?

Vac*_*ano 22 .net c# wcf-data-services

我正在尝试创建一个WCF数据服务ServiceOperation,它在服务器端进行分组,然后将数据发送到客户端.

当我尝试调用它(甚至连接到服务)时,我收到一个错误.它说它无法构建一个接口.

我使用的唯一界面是IGrouping.

什么是这个界面的实际类?


更新:

我在调试示例应用程序时检查了类型,它告诉我它是:

System.Linq.Lookup<TKey,TElement>.Grouping
Run Code Online (Sandbox Code Playgroud)

但它的装配是什么?

Mar*_*age 26

BCL实现中的几种类型IGrouping,但它们都是内部的,除了IGrouping接口外无法访问.

但是,IGrouping仅仅是一个IEnumerable<TElement>带有相关键的.您可以轻松实现IGrouping由a支持的List<TElement>并且不应该难以跨调用边界序列化:

public class Grouping<TKey, TElement> : IGrouping<TKey, TElement> {

  readonly List<TElement> elements;

  public Grouping(IGrouping<TKey, TElement> grouping) {
    if (grouping == null)
      throw new ArgumentNullException("grouping");
    Key = grouping.Key;
    elements = grouping.ToList();
  }

  public TKey Key { get; private set; }

  public IEnumerator<TElement> GetEnumerator() {
    return this.elements.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

}
Run Code Online (Sandbox Code Playgroud)

应用GroupBy运算符后,您可以创建Grouping实例列表:

var listOfGroups =
  source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 可能最简单的方法是:var newGrouping = new List <MyType>().GroupBy(t => t.MyKey); (2认同)
  • @aBetterGamer:我认为问题不在于如何创建一个“IGrouping”,正如您所指出的那样,这很容易,而是如何在序列化边界的另一侧重新创建实现“IGrouping”的“东西”。 (2认同)

AJ *_*son 11

这可能是IGrouping最基本和最通用的实现.它的构造函数接受一个键和一组值.

public class Grouping<TKey, TElement> : IGrouping<TKey, TElement>
{
    private readonly TKey key;
    private readonly IEnumerable<TElement> values;

    public Grouping(TKey key, IEnumerable<TElement> values)
    {
        if (values == null)
            throw new ArgumentNullException("values");
        this.key = key;
        this.values = values;
    }

    public TKey Key
    {
        get { return key; }
    }

    public IEnumerator<TElement> GetEnumerator()
    {
        return values.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*Ani 5

我用一个示例应用程序检查了类型,它是这样的:System.Linq.Lookup<TKey,TElement>.Grouping。但它在什么程序集中?

它是一种嵌套在System.Linq.Lookup<TKey,TElement>; System.Core装配体内部。

 var groupingType = "1".GroupBy(x => x).Single().GetType().GetGenericTypeDefinition();
 Console.WriteLine("Type: " + groupingType);
 Console.WriteLine("Public: " + groupingType.IsPublic);
 Console.WriteLine("Assembly: " + groupingType.Assembly);
Run Code Online (Sandbox Code Playgroud)

输出:

Type: System.Linq.Lookup`2+Grouping[TKey,TElement]
Public: False
Assembly: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud)

从 .NET 4.0 开始,核心 .NET 框架中没有实现System.Linq.IGrouping<TKey,TElement>. 如果您需要这样一种类型(比如说它是可序列化的),不幸的是,您可能必须自己滚动一个。