What is the implementing class for IGrouping?

后端 未结 4 822
逝去的感伤
逝去的感伤 2020-12-03 10:41

I am trying create a WCF Data Services ServiceOperation that does grouping on the server side and then sends the data down to the client.

When I try to call it (or e

相关标签:
4条回答
  • 2020-12-03 10:52

    Here is probably the most basic and generic implementation of IGrouping. Its constructor takes a key and a set of values.

    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();
        }
    }
    
    0 讨论(0)
  • 2020-12-03 11:04

    System.Core (in System.Core.dll) http://msdn.microsoft.com/en-us/library/bb344977.aspx

    0 讨论(0)
  • 2020-12-03 11:06

    Several types in the BCL implement IGrouping, however they are all internal and cannot be accessed except by the IGrouping interface.

    But an IGrouping is merely an IEnumerable<TElement> with an associated key. You can easily implement an IGrouping that is backed by a List<TElement> and that should not be hard to serialize across a call boundary:

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

    After applying the GroupBy operator you can create a list of Grouping instances:

    var listOfGroups =
      source.GroupBy(x => ...).Select(g => new Grouping<TKey, TElement>(g)).ToList();
    
    0 讨论(0)
  • 2020-12-03 11:12

    I checked the type with a sample app and it is this:System.Linq.Lookup<TKey,TElement>.Grouping. But what assembly is it in?

    It's a type nested in System.Linq.Lookup<TKey,TElement>; internal to the System.Core assembly.

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

    Output:

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

    As of .NET 4.0, there is no public type in the core .NET framework that implements System.Linq.IGrouping<TKey,TElement>. If you need such a type (say that's serializable), you'll probably have to roll one yourself, unfortunately.

    0 讨论(0)
提交回复
热议问题