有没有可能创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有一个分组列表没有什么意义。