首页 > 后端开发 > C++ > 如何在C#中通过索引查找实现协变集合?

如何在C#中通过索引查找实现协变集合?

Susan Sarandon
发布: 2024-12-31 08:07:10
原创
736 人浏览过

How Can I Achieve Covariant Collections with Index Lookup in C#?

协变和 IList:扩展索引查找的集合

在 C# 中,协变集合允许使用子集合从父集合中检索项目。然而,标准 IEnumerable支持协方差的接口缺乏直接索引查找功能。

Since List;实现 ICollection使用 Add 方法,直接将其转换为 IList;将允许无限制地添加任何动物类型,从而违反了原始 List 的限制。

为了解决此问题,.NET 4.5 及更高版本引入了 IReadOnlyList;和 IReadOnlyCollection,它们都是协变的。 IReadOnlyList扩展 IReadOnlyCollection;使用 get 索引器,允许索引检索,同时保持协方差。

两个列表;和 ReadOnlyCollection (通过 List.AsReadOnly() 获得)实现这些接口,提供具有索引支持的协变集合。

但是,如果您需要同时具有 get 和 set 索引器的协变集合,则选项是有限的。一个可能的解决方案是将现有的 IList 包装起来。到 CovariantList 中,它仅公开获取索引器,同时提供其他必要的属性:

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }
    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        private readonly IList<T> tail;
        public T this[int index] => tail[index];
        public IEnumerator<T> GetEnumerator() => tail.GetEnumerator();
        public int Count => tail.Count;
    }
}
public interface IIndexedEnumerable<out T> : IEnumerable<T>
{
    T this[int index] { get; }
    int Count { get; }
}
登录后复制

此方法提供了一个同时支持 IEnumerable 和 IEnumerable 的协变集合。和索引检索,同时防止对原始集合的意外修改。

以上是如何在C#中通过索引查找实现协变集合?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板