【问题标题】:Passing a string as multiple parameters?将字符串作为多个参数传递?
【发布时间】:2011-05-24 21:54:43
【问题描述】:

大家好,我是 C# 的新手,我想知道是否有一种简单的方法可以将字符串作为多个参数传递。这是一个例子:

我想传递给一个接受这些参数的函数:

DoStuff(int a, string b, string c, string d)

我有一个字符串,比如“字符串 e”,它包含以下内容: 1,a,b,c

所以我想这样调用函数,DoStuff(e)。但是这当然会导致错误,因为它需要更多参数。有没有一种简单的方法可以将我的参数字符串传递给函数?

编辑:感谢所有关于函数重载的建议。这个函数是一个类构造函数,它可以有重载吗?这是代码

arrayvariable[count] = new DoStuff(e);

【问题讨论】:

  • 为什么要这样做?它并没有让我觉得是好的编程实践。如果您必须从字符串中解析出单个参数,您最终也会遇到错误,除非您投入大量工作,否则某些参数将无法通过这种方式传递。
  • 大卫,这个类代表卡片。我正在阅读一个包含 200 多张卡片的 .ini 数据库,每一行都以参数格式 (1,a,b,c) 表示,我需要创建一个包含 .ini 文件参数的这些对象的数组。我已将 .ini 文件中的每一行读入字符串列表,这就是原因。

标签: c# string parameters


【解决方案1】:

您需要对采用单个字符串的方法进行重载。然后它可以拆分字符串并创建适当的参数。

例如:

void DoStuff(int a, string b, string c, string d)
{
    // Do your stuff...
}

void DoStuff(string parameters)
{
    var split = parameters.Split(',');
    if (split.Length != 4)
          throw new ArgumentException("Wrong number of parameters in input string");

    int a;
    if (!int.TryParse(split[0], out a)
          throw new ArgumentException("First parameter in input string is not an integer");

    // Call the original
    this.DoStuff(a, split[1], split[2], split[3]);
}

当然,如果您经常这样做,可以将其重构为一种方法,使字符串解析更加通用和可重用。

【讨论】:

  • 哇你们太棒了。我还是 C# 的新手,不知道函数重载,所以这个选项会很好用。
  • 哦,我应该提到的一件事,这个函数是一个类构造函数。你可以为类构造函数重载吗?我的确切功能是:variablearray[count] = new DoStuff(e);
  • @rumsey:是的,你可以有重载的构造函数和方法。
  • 里德,再次感谢。你能看看我的预期用途(评论我的帖子),让我知道使用重载是否是一个好的解决方案吗?
  • @rumsey: 很难说 - 虽然有像这样的参数的字符串是“奇怪的”
【解决方案2】:
public void DoStuff( int a, string b, string c, string d )
{
    //your code here
}

public void DoStuff( string e )
{
   string[] splitE = e.Split( ',' );

   int a;
   int.TryParse( splitE[0], out a );

   DoStuff( a, splitE[1], splitE[2], splitE[3] );
}

您需要对 int 的拆分和解析进行额外的错误检查,但这应该会为您完成

【讨论】:

  • 看来我迟到了。里德打败了我。 :)
【解决方案3】:
public void DoStuff(int a, params String[] strings)
{
    foreach (String s in strings)
    {
        do something else;
    }
}

'params' 属性表示 DoStuff 可以有 0 个或多个字符串作为参数,编译器会自动将它们填充到一个数组中。

【讨论】:

    【解决方案4】:

    只需创建一个只包含一个参数的重载方法:

    DoStuff(string a){
        DoStuff(0, a, "","");
    }
    

    (伪代码)

    【讨论】:

    • Neal,它需要从字符串中传递正确的数字,而不是0。否则,这看起来最简单。
    • @rumsey,我只是让它为其他参数传递空值(或 0),我不知道你想拆分它
    【解决方案5】:

    这里有几个选项,具体取决于您实际尝试执行的操作。一种是您可以将字符串拆分并将每个部分发送到应该分配给它的特定参数(或者如果您想要的话,将完整的字符串发送到每个参数)。

    另一种选择是重载该方法,要么只接受一个参数(如果你只需要一个),要么将你的字符串分成几部分,然后调用原始方法。我建议不要在重载方法中拆分字符串,除非您确定字符串中的值的顺序是什么。我担心的是,您在使用重载的过程中会在字符串中获取错误的值顺序。这会导致意想不到的结果。因此,除非您有明确的案例来创建重载方法,否则我建议您使用第一个选项。

    【讨论】:

      【解决方案6】:

      如果您拥有DoStuff 方法,请使用一个参数DoStuff(string e) 创建重载

      然后传递字符串,并在方法中使用分隔符分割字符串。

      【讨论】:

        【解决方案7】:
        Public void DoStuff(String e){
            string[] params = s.Split(",");
            int a = int.Parse(params[i]);
            string b = params[1];
            string c = params[2];
            string d = params[3];
            DoStuff(int a, string b, string c, string d);
        }
        

        【讨论】:

          【解决方案8】:

          您也可以将它们设为可选参数。 http://msdn.microsoft.com/en-us/library/dd264739.aspx

          void DoStuff(string a, string b = null, string c = null, string d = null)
          {
          
          }
          

          【讨论】:

            【解决方案9】:

            如果这些代表卡片,那么我会远离字符串,并为自己创建一个真正的类型。也许是这样的:

            public class Card
            {
                public int a;
                public string b, c, d;
            
                public Card(int a, string b, string c, string d)
                {
                    this.a = a;
                    this.b = b;
                    this.c = c;
                    this.d = d;
                }
            
                public static Card Parse(string input)
                {
                    int a;
                    string b, c, d;
                    // There are several string splitting methods shown in other answers, pick the one you like.
                    return new Card(a, b, c, d);
                }
            }
            

            让您的方法以 Card 作为参数,而不是字符串。您还可以将 Card 用于所有存储空间,即上面显示的 arrayvariable[]

            我建议你不要在课堂上使用名称 a、b、c、d,使用真实姓名。军衔、花色等

            【讨论】:

              猜你喜欢
              • 2016-07-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-02
              • 1970-01-01
              • 2021-03-22
              相关资源
              最近更新 更多