有没有可能创build一些IGrouping对象

我有List<IGrouping<string,string>>

是否有可能添加新的项目到这个列表? 或者实际上,是否可以创build一些IGrouping对象?

如果你真的想创build自己的IGrouping<TKey, TElement> ,那么这是一个简单的接口来实现:

 public class MyGrouping<TKey, TElement> : List<TElement>, IGrouping<TKey, TElement> { public TKey Key { get; set; } } 

这个类inheritance自List<T>并实现了IGrouping接口。 除了作为IEnumerableIEnumerable<TElement> (哪个List<T>满足)的要求,唯一要实现的属性是Key

从这里你可以创build你想要的所有MyGrouping<string, string> ,并将它们添加到你的List<IGrouping<string,string>>

从.NET 4.0开始,BCL中似乎没有任何实现IGrouping<TKey, TElement>接口的公共types,因此您将无法轻松地进行“新build”。

当然,没有什么可以阻止你:

  1. @Nathan Anderson指出,自己创build一个实现接口的具体types。
  2. 从LINQ查询(如ToLookupGroupBy获取IGrouping<TKey, TElement>的实例/实例,并将其添加到列表中。
  3. 在组的现有序列(从ToLookup / GroupBy)上调用ToList() )。

例:

 IEnumerable<Foo> foos = .. var barsByFoo = foos.ToLookup(foo => foo.GetBar()); var listOfGroups = new List<IGrouping<Foo, Bar>>(); listOfGroups.Add(barsByFoo.First()); // a single group listOfGroups.AddRange(barsByFoo.Take(3)); // multiple groups 

但是, 为什么你想要这样做还不清楚。

 IGrouping<TKey, TElement> CreateGroup<TKey, TElement>(IEnumerable<TElement> theSeqenceToGroup, TKey valueForKey) { return theSeqenceToGroup.GroupBy(stg => valueForKey).FirstOrDefault(); } 

你也可以通过不对列表中的某些东西进行分组来破解分组:

 var listOfGroups = new[] { "a1", "a2", "b1" } .GroupBy(x => x.Substring(0, 1)) .ToList(); // baz is not anything to do with foo or bar yet we group on it var newGroup = new[] { "foo", "bar" }.GroupBy(x => "baz").Single(); listOfGroups.Add(newGroup); 

listOfGroups然后包含:

 a: a1, a2 b: b1 baz: foo, bar 

IDEOne的例子

 var headers = from header in new[] { new { Name = "One", List = new[] { "One 1", "One 2", "One 2" } }, new { Name = "Two", List = new[] { "Two 1", "Two 2", "Two 2" } } } from value in header.List group value by header.Name; 

IGrouping接口用于LINQ中的GroupBy()运算符。 您通常会从具有group by子句的LINQ查询中获取一个IGrouping对象。 尽pipe有一个分组列表没有什么意义。