【问题标题】:Is there an interface that can be used as a parameter in a method for T[] (an array of type T) and for List<T>是否有一个接口可以用作 T[](T 类型的数组)和 List<T> 的方法中的参数
【发布时间】:2023-01-09 19:09:30
【问题描述】:

我有两种执行相同任务的方法:一种接收数组参数和 List 参数,两者都是字符串类型。
有没有办法用一种方法来代替这两种方法?什么类型的参数可以替代两者?
这些方法是:

    public static void NumberLinesInCollection(List<string> list, int startNumberingFromRowNumber = 0)
    {
        int numberOfLines = list.Count;
        for (int i = startNumberingFromRowNumber; i < numberOfLines; i++)
        {
            string sourceString = (i + 1).ToString();
            string resultingString = StringOperations.PadWithBlanks(originalString: (i + 1).ToString(), 
                                                                    fieldLength: numberOfLines.ToString().Length, 
                                                                    position: PaddingDirection.left);
            list[i] = resultingString + ". " + list[i];
        }
    }    

    public static void NumberLinesInCollection(string[] arrayOfStrings, int startNumberingFromRowNumber = 0)
    {
        int numberOfLines = arrayOfStrings.Length;
        for (int i = startNumberingFromRowNumber; i < numberOfLines; i++)
        {
            string resultingString = StringOperations.PadWithBlanks(originalString: (i + 1).ToString(),
                                                                    fieldLength: numberOfLines.ToString().Length,
                                                                    position: PaddingDirection.left);
            arrayOfStrings[i] = resultingString + ". " + arrayOfStrings[i];
        }
    }    

先感谢您。

【问题讨论】:

  • T[]List&lt;T&gt;都实现了IList&lt;T&gt;(顺便说一下,ICollection&lt;T&gt;IEnumerable&lt;T&gt;

标签: c# arrays list interface


【解决方案1】:

来自the documentation of System.Array

一维数组实现 IList&lt;T&gt;ICollection&lt;T&gt;IEnumerable&lt;T&gt;IReadOnlyList&lt;T&gt;IReadOnlyCollection&lt;T&gt; 通用接口。这些实现在运行时提供给数组,因此,通用接口不会出现在 Array 类的声明语法中。

来自the documentation of List&lt;T&gt;

实现ICollection&lt;T&gt;IEnumerable&lt;T&gt;IList&lt;T&gt;IReadOnlyCollection&lt;T&gt;IReadOnlyList&lt;T&gt;[和一些非通用接口]

正如我们所看到的,有一个很好的重叠,允许您根据您需要的实际数组/列表功能选择最合适的接口。在您的特定情况下,IList&lt;T&gt; 似乎是最合适的,因为它提供了您在代码中使用的 Item[] indexer

【讨论】:

    【解决方案2】:

    您可以使用IList&lt;string&gt;,这将允许您在调用NumberLinesInCollection 时将List 和Array 作为参数传递。 array 和 list 都实现了IList

    【讨论】:

    • @JohnathanBarclay 我最初打错了,我输入的是IList。道歉
    • 我会添加一些关于 IList&lt;T&gt; 的内容,同时公开一个可设置的索引器,这就是为什么它是必需的,而不是更通用的 ICollection&lt;T&gt;
    • @JohnathanBarclay 谢谢你添加这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多