有两个相同大小的参数列表

Having two param lists with same size

方法 PrintTimes(string a, int b) 打印字符串 ab 次(即 PrintTimes("test",3) 将打印 testtesttest)。

我想创建一个方法,它将获得一个 params 字符串数组和一个 params 整数数组。所以调用函数会像这样

PrintTimes("A","B","C","D",2,1,3,2);

PrintTimes("A",2,"B",1,"C",3,"D",2)

两者都将打印 AABCCCDD

因为一个方法中只能有一个params参数,所以这是不可能的。那么有没有办法做到这一点?

我知道我可以用一个字符串和一个 int 变量创建一个 Class,并为 class 创建一个 params 数组。但我宁愿不这样做,因为这将涉及为每个 set

构建一个新的 Class

为什么不使用 class

public class PrintParameter
{
    public int Count {get;set;}
    public string Content{get;set;}
}

然后

public void PrintTimes(List<PrintParameter> inputs)
{
    //for each input print the "Content", "Count" times
}

public void PrintTimes(params PrintParameter[] inputs)
{
    //for each input print the "Content", "Count" times
}

如果您不想定义 class,您可以尝试 List<KeyValuePair<string,int>> 或其他替代方法,例如 List<Tuple<string,int>> 等。然而,首选的做法是使用具有有意义属性的 class。

如何只删除 params 关键字并改为使用数组?即使签名PrintTimes(string[], int[])PrintTimes(new[]{"A","B","C","D"}, new[]{2,1,3,2}); 没那么多要写了。

您可以通过多种方式解决此问题。虽然你只能有一个 params,但你可以将两个参数都设为数组:

PrintTimes(string[] strings, int[] printCounts)
{
    // Assert strings.Length == printCounts.Length
    for (int i = 0; i < strings.Length; i++)
    {
        for (int j = 0; j < printCounts[i]; j++)
        {
            // Print strings[i]
        }
    }
}

那么可以这样调用:

int[] numbers = new int[3] {1, 2, 3};
string[] names = new string[3] {"Matt", "Joanne", "Robert"};
PrintTimes(names, numbers);

跟进 Hossein 的建议,为什么不像下面这样简单:

void PrintTimes(List<String> strings, List<Int> count)

(或者像评论说的那样把它做成一个数组)然后在 PrintTimes 内部要求输入的长度相同,或者当它们不相同时会出现一些逻辑错误。