使用ICollection和IEnumerable <t> </t>

时间:2015-03-24 07:49:01

标签: c# linq generics

我有一些代码需要ICollection。现在我想通过基于给定属性对它们进行分组来将该集合分成更小的块(我的集合中的所有元素都是抽象基类的实例,但是对于遗留代码,我们不使用该接口的泛型版本)。所以我想要实现的是获取任何可枚举的集合列表(每个组一个)。为此,我计划在ICollection上使用IEnumerable<T> - 方法将Cast<T>转换为通用ICollection,然后使用IEnumerable<T>使用public override void DoSomething(ICollection features) { var grp = features.Cast<MyBaseClass>().GroupBy(x => x.table); foreach(var g in grp) base.DoSomething(g); } 构建字典一个LINQ查询。但我倒下了可能会有一些更好的方法。你有吗?

ICollection

编辑:因此基本方法(当然)具有相同的signatur(也期望ICollection的实例)如何将组的值返回到(非泛型){{1}} ?

1 个答案:

答案 0 :(得分:2)

我认为您的方法没有任何问题,但有一点需要注意:如果ICollection实例包含的元素不是类型{{1 ,你将获得一个强制转换异常。您可以使用MyBaseClass扩展方法解决此问题,该方法检查元素是否实际属于该类型,如果是,则将其强制转换为目标类型。如果元素的类型不同,则只会忽略该元素,并且不会抛出任何异常。

OfType

您可以在此处查看一个有效的示例:https://dotnetfiddle.net/0VkedY

当然,如果您的要求是所有元素必须属于特定类型,则应使用public override void DoSomething(ICollection features) { var grp = features.OfType<MyBaseClass>().GroupBy(x => x.table); foreach(var g in grp) base.DoSomething((ICollection)g.ToList()); } 代替Cast