web-dev-qa-db-ja.com

IGroupingの実装クラスは何ですか?

サーバー側でグループ化を行い、データをクライアントに送信するWCF Data ServicesServiceOperationを作成しようとしています。

電話をかけようとすると(またはサービスに接続しようとすると)、エラーが発生します。インターフェースを構築できないとのことです。

私が使用している唯一のインターフェースはIGroupingです。

このインターフェースの実際のクラスは何ですか?


更新:

サンプルアプリのデバッグ中にタイプを確認したところ、次のように表示されました。

System.Linq.Lookup<TKey,TElement>.Grouping

しかし、それはどの議会にありますか?

22
Vaccano

BCLのいくつかのタイプはIGroupingを実装しますが、それらはすべて内部であり、IGroupingインターフェース以外ではアクセスできません。

ただし、IGroupingは、関連付けられたキーを持つIEnumerable<TElement>にすぎません。 List<TElement>に裏打ちされたIGroupingを簡単に実装でき、呼び出しの境界を越えてシリアル化するのは難しくありません。

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(); }

}

GroupBy演算子を適用した後、Groupingインスタンスのリストを作成できます。

var listOfGroups =
  source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
26

これはおそらく、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();
    }
}
11
AJ Richardson

サンプルアプリでタイプを確認したところ、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);

出力:

Type: System.Linq.Lookup`2+Grouping[TKey,TElement]
Public: False
Assembly: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

.NET 4.0の時点では、コア.NETFrameworkにSystem.Linq.IGrouping<TKey,TElement>を実装するパブリックタイプはありません。そのようなタイプが必要な場合(たとえば、シリアル化可能)、残念ながら、おそらく自分でロールする必要があります。

4
Ani