Что такое класс реализации для IGrouping? - PullRequest
22 голосов
/ 14 декабря 2011

Я пытаюсь создать сервисную операцию служб данных WCF, которая выполняет группировку на стороне сервера и затем отправляет данные клиенту.

Когда я пытаюсь вызвать ее (или даже подключиться к службе), яполучить ошибку.Он говорит, что не может создать интерфейс.

Единственный интерфейс, который я использую, - это IGrouping.

Что такое / фактический класс для этого интерфейса?


Обновление:

Я проверил тип при отладке примера приложения ион сказал мне, что это было:

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

Но в какой сборке он находится?

Ответы [ 4 ]

25 голосов
/ 14 декабря 2011

Несколько типов в BCL реализуют IGrouping, однако все они являются внутренними и не могут быть доступны, кроме как через интерфейс IGrouping.

Но IGrouping - это просто IEnumerable<TElement> со связаннымключ.Вы можете легко реализовать IGrouping, который поддерживается 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(); }

}

После применения оператора GroupBy вы можете создать списокиз Grouping экземпляров:

var listOfGroups =
  source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
11 голосов
/ 20 марта 2015

Вот, пожалуй, самая базовая и общая реализация 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();
    }
}
4 голосов
/ 14 декабря 2011

Я проверил тип с помощью примера приложения, и это: System.Linq.Lookup<TKey,TElement>.Grouping.Но в какой сборке он находится?

Это тип, вложенный в System.Linq.Lookup<TKey,TElement>;встроенный в сборку * 1007. *System.Linq.IGrouping<TKey,TElement>.Если вам нужен такой тип (скажем, это сериализуемый), вам, к сожалению, придется его свернуть самостоятельно.

0 голосов
/ 14 декабря 2011
...