有两个相同大小的参数列表
Having two param lists with same size
方法 PrintTimes(string a, int b)
打印字符串 a
、b
次(即 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 内部要求输入的长度相同,或者当它们不相同时会出现一些逻辑错误。
方法 PrintTimes(string a, int b)
打印字符串 a
、b
次(即 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
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 内部要求输入的长度相同,或者当它们不相同时会出现一些逻辑错误。