C# - 如何在不使用索引器的情况下获取自定义集合的第一项?

Posted

技术标签:

【中文标题】C# - 如何在不使用索引器的情况下获取自定义集合的第一项?【英文标题】:C# - How can I get the first item of a custom collection without using an indexer? 【发布时间】:2020-08-25 23:47:24 【问题描述】:

所以,我正在尝试构建一个自定义类型的集合,如果我不使用索引器,它可以访问集合中的第一项。 假设课程开始是这样的..

public class myCollection : IEnumerable<myCustomObject>

...

我想这样使用它:

var coll = new myCollection();    
coll.someMember = "test";
coll[3].someMember = "test3";

有什么办法可以做到吗?

编辑:似乎有一种方法可以使用关键字“this”作为构造函数的一部分,但我不知道如何实际这样做以及它是否能满足我的需要。

【问题讨论】:

为什么你的班级has-a 收藏和is-a 收藏? IEnumerable&lt;T&gt; 允许您枚举但不能编辑或执行随机访问,ICollection&lt;T&gt; 建立在IEnumerable&lt;T&gt; 之上,并增加了添加、删除和计数项目的能力。 IList&lt;T&gt; 扩展 ICollection&lt;T&gt; 以添加索引器。也许您只是想实现IList&lt;T&gt;?或者,您可以继续使用 IEnumerable&lt;T&gt;,但添加一个索引器:docs.microsoft.com/en-us/dotnet/api/… 我...我想这就是我最初学习如何制作定制系列的方式。现在回想起来,没有任何意义。谢谢,我会删除它。 @MartinCostello,谢谢,我会调查 IList 和索引器。 【参考方案1】:

我不明白类结构背后的逻辑从一个集合下降并且也有一个集合,但我想我不需要:

var coll = new myCollection();    //for this to work your myCollection class needs an accessible constructor
coll.someMember = "test";         //for this to work your myCollection class needs a property called someMember
coll[3].someMember = "test3";     //for this to work your myCollection class needs an indexer that uses the parent collection's ElementAt and myCustomObject class needs a property called someMember

“你的 myCollection 类需要一个索引器”我的意思是你需要类似这个属性的东西:

public myCustomObject this[int idx]
  get  return base.ElementAt(idx); 

【讨论】:

谢谢!不确定 indexer 属性。【参考方案2】:

这是一个有点奇怪的请求,您可能应该考虑是否让您的代码对未来的开发人员来说有点混乱,但是您可以通过让您的集合实现与您的集合类型相同的接口来完成它:

    public interface IMyCustomObject
    
        string SomeMember  get; 
    

    public class MyCustomObject : IMyCustomObject
    
        public string SomeMember => "Hi";
    

    public class MyCollection : IEnumerable<MyCustomObject>, IMyCustomObject
                
        public string SomeMember => this.FirstOrDefault()?.SomeMember;
    

【讨论】:

以上是关于C# - 如何在不使用索引器的情况下获取自定义集合的第一项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新索引的情况下将项目添加到 laravel 列表集合中?

描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

如何在不知道数据库总行数的情况下执行自定义分页

如何在不使用帮助器的情况下访问 Meteor 模板中的全局变量?

如何在不点击的情况下从 Chrome 自定义标签中捕获 URL?

如何使用 C# 在 WMI 中读取 ManagementObject 集合