Передача строки в виде нескольких параметров? - PullRequest
2 голосов
/ 25 мая 2011

Эй, ребята, я довольно новичок в C #, и мне интересно, есть ли простой способ передать строку в виде нескольких параметров. Вот пример:

Я хочу перейти к функции, которая принимает следующие параметры:

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

У меня есть строка, скажем "строка e", которая содержит следующее: 1, а, б, в

Так что я хотел бы вызвать функцию следующим образом: DoStuff (e). Но, конечно, это приводит к ошибкам, потому что ожидает больше параметров. Есть ли простой способ передать мою строку параметров в функцию?

РЕДАКТИРОВАТЬ: Спасибо за все советы по перегрузкам функций. Эта функция является конструктором класса, может ли она иметь перегрузки? Вот код

arrayvariable[count] = new DoStuff(e);

Ответы [ 9 ]

4 голосов
/ 25 мая 2011

Вам потребуется перегрузить метод, который принимает одну строку.Затем он может разбить строку и создать соответствующие параметры.

Например:

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]);
}

Конечно, можно было бы реорганизовать это в метод, который мог бы сделать анализ строки более общими многоразового использования, если вы часто будете этим заниматься.

3 голосов
/ 25 мая 2011
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, но это должно сделать это для вас

1 голос
/ 25 мая 2011
public void DoStuff(int a, params String[] strings)
{
    foreach (String s in strings)
    {
        do something else;
    }
}

Атрибут 'params' указывает, что DoStuff может иметь 0 или более строк в качестве параметров, и компилятор автоматически вставляет их в массив для вас.

0 голосов
/ 25 мая 2011

Если бы они представляли карты, то я бы отошел от струн и создал себе настоящий тип. Возможно, что-то вроде этого:

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, а не строку. Вы также можете использовать Карту для всего вашего хранилища, arrayvariable[], которое вы показали выше.

Я бы порекомендовал вам не использовать имена a, b, c, d в вашем классе, использовать настоящие имена. Ранг, костюм и т. Д.

0 голосов
/ 25 мая 2011
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);
}
0 голосов
/ 25 мая 2011

Вы также можете сделать их необязательными параметрами. http://msdn.microsoft.com/en-us/library/dd264739.aspx

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

}
0 голосов
/ 25 мая 2011

Если вы владеете методом DoStuff, создайте перегрузку с одним параметром DoStuff(string e)

Затем передайте строку и разделите строку в методе, используя разделитель.

0 голосов
/ 25 мая 2011

У вас есть несколько вариантов здесь, в зависимости от того, что вы на самом деле пытаетесь сделать. Во-первых, вы можете разбить строку и отправить каждую часть определенному параметру, которому она должна быть назначена (или отправить полную строку каждому параметру, если это то, что вам нужно).

Другой вариант - перегрузить метод и либо принять только один параметр (если он вам нужен), либо разбить строку на части, а затем вызвать оригинальный метод. Я бы рекомендовал не разбивать строку в перегруженном методе, если вы не знаете наверняка, в каком порядке будут значения внутри строки. Я боюсь, что в будущем вы будете использовать перегрузку, но получите неверный порядок значений в строке. Это приведет к неожиданным результатам. В результате я бы порекомендовал сделать первый вариант, если у вас нет ясного случая для создания перегруженного метода.

0 голосов
/ 25 мая 2011

Просто создайте перегруженный метод, который содержит только один параметр:

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

(псевдокод)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...