在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是啥

Posted

技术标签:

【中文标题】在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是啥【英文标题】:What's the most efficient way to have a method that takes an indexable list of any type in c#在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是什么 【发布时间】:2019-04-22 20:49:28 【问题描述】:

我希望能够编辑任何或大部分在 C# 中使用索引器的通用列表类型,如下所示:

void testIList(System.Collections.IList someList)

    for (int i = 0; i < someList.Count; i++)
    
        someList[i] = someList.Count - i;
    


void test()

    int[] intArray = new int[10];
    List<int> intList = new List<int>();
    List<string> stringList = new List<string>();

    for(int i=0;i<10;i++)
    
        intList.Add(0);
        stringList.Add("test");
    

    testIList(intArray);
    testIList(intList);

    testIList(stringList);

代码可以运行,但 testIList(stringList) 当然没有编译时错误,这是不可取的。

另外,testIList 中是否存在装箱和拆箱,我可以通过使用一些更具体的泛型集合作为参数中的类型来避免这种情况?

【问题讨论】:

为什么不使用泛型? MSDN link 【参考方案1】:

使用IList的通用接口:IList&lt;T&gt;

void testIList<T>(System.Collections.Generic.IList<T> someList)

    for (int i = 0; i < someList.Count; i++)
    
        someList[i] = default(T);
    

当然,您必须自己弄清楚确定设置列表项的值的逻辑是什么,但至少default(T) 会告诉您代码有效。

【讨论】:

我认为你甚至可以使用 IEnumerable&lt;T&gt;,因为它不如 IList&lt;T&gt; 特定,并且可以支持更多的“通用列表类型” 不支持索引分配@BoredomOverload【参考方案2】:

您可以使用System.Collections.Generic.IList&lt;T&gt; 接口来仅允许实现该接口的那些集合,例如List&lt;int&gt;int[] 和其他一些集合。它不允许像 ArrayListList&lt;object&gt; (您当前的代码可以使用)这样的非泛型列表类型,但这通常是一件好事而不是坏事。

void TestIList(IList<int> someList)

    for (int i = 0; i < someList.Count; i++)
    
        someList[i] = someList.Count - i;
    

【讨论】:

以上是关于在 c# 中拥有一个采用任何类型的可索引列表的方法的最有效方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

C#不一致的可访问性:返回类型比方法更难访问

具有 set Input() 任何类型的可重用组件是一个好习惯吗?

为何说C#中的delegate是类型安全的可管理的

C# 数据结构,可以动态调整大小到给定限制的列表,并允许快速访问任何索引

c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问

这样做的更好方法? C#中的列表索引分配