交替参数

时间:2012-03-09 15:40:32

标签: c# params

方法参数是否有一种交替的参数? 我喜欢关键字 params 。但有时我需要两个参数 params 我想调用这样的方法:

Method(1, "a", 2, "b", 3, "c")

其中1,2和3是键,“a”,“b”和“c”是赋值。

如果我尝试定义方法参数,我会直观地尝试将 params 用于两个参数,如下所示:

void Method(params int[] i, string[] s)

编译器会将奇数位置的每个参数添加到第一个参数,将偶数位置的每个参数添加到第二个参数 但是(如你所知) params 只能用于最后一个参数。

当然我可以创建一个参数类(例如KeyValue)并使用它:

Method(new[] {new KeyValue(1, "a"), new KeyValue(2, "b"), new KeyValue(3, "c")})

但是那个代码太多了。

是否有更短的符号?

修改:刚才我找到了另一个问题answer:它建议继承 List 并重载 Add 方法,以便通过这种方式初始化新的List:

new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }}

方法定义是:

void Method(KeyValueList<int, string> list)

电话会是:

 Method(new KeyValueList<int, string>{{ 1, "a" }, { 2, "b" }, { 3, "c" }})

3 个答案:

答案 0 :(得分:3)

没有&#34;交替参数&#34;你描述的符号。

您只能拥有一个params参数,并且必须是最后一个 - 如果您希望将不同类型作为参数参数,则可以使用object作为数组类型。

考虑传入由自定义类型构成的列表,该列表保留这些项目的含义。

public class MyType
{
  public int MyNum { get; set; }
  public string MyStr { get; set; }
}

Method(List<MyType> myList);

答案 1 :(得分:1)

你可以通过params object[] keysAndValues做到这一点并自己解决,但是...它有点icky,所有的装箱/拆箱会发生什么。

答案 2 :(得分:0)

为今天正在寻找解决方案的开发人员提供最新答案...

老派答案:

您可以创建一个包含所需类型的参数的类或结构...

<p>Made with <span style="color: #ff0000;">&#10084;</span> by WAP </p>

...然后定义您的函数以将其接受为params数组...

struct Struct {
   public int Integer {get; set;}
   public string Text {get; set;}
   
   public Struct(int integer, string text) {
      Integer = integer;
      Text = text;
   }
}

...并称呼它...

void Method(params Struct[] structs)

新学校答案:

或者,使用最新的C#,您只需使用ValueTuples ...

Method(new Struct(1, "A"), new Struct(2, "B"), new Struct(3, "C"));

...并称呼它...

Method(params (int, string)[] valueTuples)