有没有可能创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接口。 除了作为IEnumerable和IEnumerable<TElement> (哪个List<T>满足)的要求,唯一要实现的属性是Key 。
从这里你可以创build你想要的所有MyGrouping<string, string> ,并将它们添加到你的List<IGrouping<string,string>> 。
从.NET 4.0开始,BCL中似乎没有任何实现IGrouping<TKey, TElement>接口的公共types,因此您将无法轻松地进行“新build”。
当然,没有什么可以阻止你:
- @Nathan Anderson指出,自己创build一个实现接口的具体types。
- 从LINQ查询(如
ToLookup和GroupBy获取IGrouping<TKey, TElement>的实例/实例,并将其添加到列表中。 - 在组的现有序列(从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有一个分组列表没有什么意义。