C# 在c中调用参数数量未知的函数#

C# 在c中调用参数数量未知的函数#,c#,params,C#,Params,我有一个函数 public static SomeFunction(string a, string b = "", string c = "", string d = "") { return a + b + c + d; } 我有一个未知数量的字符串(1-4)存储在列表中(也可以以不同的方式存储) 即使我不知道列表中有多少项,现在如何使用字符串调用SomeFunction() 函数已给定且无法更改。void SomeFunction(params string[]val)允许您传递任意数量

我有一个函数

public static SomeFunction(string a, string b = "", string c = "", string d = "")
{
return a + b + c + d;
}
我有一个未知数量的字符串(1-4)存储在列表中(也可以以不同的方式存储)

即使我不知道列表中有多少项,现在如何使用字符串调用SomeFunction()


函数已给定且无法更改。

void SomeFunction(params string[]val)允许您传递任意数量的字符串参数,这些参数从函数内部被视为数组。如果您想传递任何内容,可以在
params
关键字之后使用
object[]

如果是这样的话,您的功能会更好:

public static string SomeFunction(IEnumerable<string> values)
{
    return string.Concat(values);
}
public static string SomeFunctionInvoker(IEnumerable<string> values)
{
    var listStr = values.ToArray();    //<-- Requires System.Linq

    if (listStr.Length > 4)
        throw new ArgumentException("Too many arguments provided");

    if (listStr.Length == 0)
        throw new ArgumentException("Not enough arguments provided");

    string[] strArray4 = new string[4];

    Array.Copy(listStr, strArray4, listStr.Length);

    return SomeFunction(strArray4[0], strArray4[1], strArray4[2], strArray4[3]);
}
基本上,这里发生的事情是将一个
IEnumerable
传递给调用者函数,以确保参数的数量适合
SomeFunction
参数列表。然后,它创建一个具有最大参数数的数组,将原始数组复制到其中,然后将所有参数传递给
SomeFunction

仅当
SomeFunction
的默认参数使用
string.Empty
null
作为默认值时,此选项才有效。如果它有一些其他的默认值,.

这个呢

    List<string> list = new List<string> { "aaa", "bbb" };

    switch(list.Count){
        case 1: SomeFunction(list[0]);break;
        case 2: SomeFunction(list[0], list[1]);break;
        case 3: SomeFunction(list[0], list[1], list[2]);break;
        case 4: SomeFunction(list[0], list[1], list[2], list[3]);break;
        default: throw new ArgumentException("List length out of range");
    }
List List=新列表{“aaa”、“bbb”};
开关(list.Count){
案例1:SomeFunction(列表[0]);break;
案例2:SomeFunction(列表[0],列表[1]);break;
案例3:SomeFunction(列表[0],列表[1],列表[2]);break;
案例4:SomeFunction(列表[0],列表[1],列表[2],列表[3]);break;
默认值:抛出新ArgumentException(“列表长度超出范围”);
}

好吧,简单的方法就是把它包装起来:

string MyFunctionEx(IList<string> values) {
   switch (values.Length) {
       case 1:
          return MyFunction(values[0]);
       case 2:
          return MyFunction(values[0], values[1]);
       case 3:
          return MyFunction(values[0], values[1], values[2]);
       case 4:
          return MyFunction(values[0], values[1], values[3], values[4]);
       break:
          throw new InvalidOperationException();
}

假设“+”的意思是加入,而不是将它们作为数字添加,我会推荐一些简单快捷的方法,如:

public string joinMyStrings(List<string> values) 
{
     return string.Join("", values);  // add any dividers if wanted
}
公共字符串joinMyString(列表值)
{
返回string.Join(“,values);//如果需要,添加任何分隔符
}

pass the list instead问题是,我有一个列表,其中包含未知数量的项,我希望将每个项传递给函数,而不是相反。为什么不传递列表本身?因为我无法更改函数。然后在调用函数之前检查列表的长度。这里真正的问题是什么?函数是给定的,我正在考虑这种方法,但我不能改变函数本身。在这种情况下,您可能需要借助反射来完成它,请参阅@Kalerion查看我的编辑,以了解另一种方法。
public string joinMyStrings(List<string> values) 
{
     return string.Join("", values);  // add any dividers if wanted
}