使用 ICollection 和 IEnumerable<T>

work with ICollection and IEnumerable<T>

我有一些代码需要 ICollection。现在我想通过根据给定属性对该集合进行分组来将该集合分成更小的块(我集合中的所有元素都是抽象基础的实例-class,但是对于遗留代码,我们不使用它的通用版本界面)。所以我想要实现的是获得任何可枚举的集合列表(每个组一个)。为此,我计划在 ICollection 上使用 Cast<T> 方法将 ICollection 转换为通用 IEnumerable<T>,然后使用 IEnumerable<T> 从该 IEnumerable<T> 构建字典LINQ 查询。但我认为可能有一些更好的方法。你有吗?

public override void DoSomething(ICollection features)
{
    var grp = features.Cast<MyBaseClass>().GroupBy(x => x.table);
    foreach(var g in grp) base.DoSomething(g);
}

编辑:因此基本方法(肯定)具有相同的签名(也需要 ICollection 的实例)如何将组的值返回到(非通用)ICollection?

我认为您的方法没有任何问题,但有一个警告:如果 ICollection 实例包含一个 不是 类型的元素MyBaseClass,你会得到一个转换异常。您可以使用 OfType 扩展方法解决此问题,该方法检查元素是否确实属于该类型,如果是,则将其转换为目标类型。如果元素是不同的类型,它只是被忽略并且不会抛出异常。

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

您可以在此处查看工作示例:https://dotnetfiddle.net/0VkedY

当然,如果你的要求是所有元素必须是特定类型,你应该使用Cast而不是OfType