views:

363

answers:

8

In C# you can do this:

foo = string.Format("{0} {1} {2} {3} ...", "aa", "bb", "cc" ...);

This method Format() accepts infinite parameters, being the first one how the string should be formatted and the rest are values to be put in the string.

Today I've come to a situation where I had to get a set of strings and test them, then I remembered this language functionality, but I had no clue. After a few unsuccessful web searches, I've realised it would be more prudent to just get an array, which didn't make me quite satisfied.

Q: How do I make a function that accepts infinite parameters? And how do I use it ?

+30  A: 

With the params keyword.

Here is an example:

    public int SumThemAll(params int[] numbers)
    {
        return numbers.Sum();
    }

    public void SumThemAllAndPrintInString(string s, params int[] numbers)
    {
        Console.WriteLine(string.Format(s, SumThemAll(numbers)));
    }

    public void MyFunction()
    {
        int result = SumThemAll(2, 3, 4, 42);
        SumThemAllAndPrintInString("The result is: {0}", 1, 2, 3);
    }

The code shows various things. First of all the argument with the params keyword must always be last (and there can be only one per function). Furthermore, you can call a function that takes a params argument in two ways. The first way is illustrated in the first line of MyFunction where each number is added as a single argument. However, it can also be called with an array as is illustrated in SumThemAllAndPrintInString which calls SumThemAll with the int[] called numbers.

klausbyskov
Mind to elaborate ?
MarceloRamires
@MarceloRamires: Click the link. I can't explain it better than the documentation anyway ;-)
klausbyskov
Actually you can; that explanation is just 2 lines plus an example. Not saying that the documentation isn't good enough, just saying that you could explain it better if you wanted to.
Andreas Bonini
@MarceloRamires: `string.Format("{0} {1} {2} {3}", "aa", "bb", "cc")` looks like `Format(params object[] args)` where args = {"aa", "bb", "cc"}. Make sense?
Pat
@MarceloRamires I have elaborated. Hope it makes sense.
klausbyskov
+1  A: 

use the params keyword. For example

static void Main(params string[] args)
{
    foreach (string arg in args)
    {
        Console.WriteLine(arg);
    }
}
Russ Cam
Thanks but... "and how do i use it?"
MarceloRamires
+15  A: 

Use the params keyword. Usage:

public void DoSomething(int someValue, params string[] values)
{
    foreach (string value in values)
        Console.WriteLine(value);
}

The parameter that uses the params keyword always comes at the end.

David Morton
And the infinite values should be in the end, right? if i wanted a single integer along with it, it **MUST** be in the beginning, right ?
MarceloRamires
@MarceloRamires - Correct, it must be on the end.
Nick Craver
@MarceloRamiers - Your method would look like public void DoSomething(int myvalue, params string[] values)
David Basarab
+1  A: 

You can achieve this by using the params keyword.

Little example:

public void AddItems(params string[] items)
{
     foreach (string item in items)
     { 
         // Do Your Magic
     }
}
Shaharyar
+1  A: 
    public static void TestStrings(params string[] stringsList)
    {
        foreach (string s in stringsList){ } 
            // your logic here
    }
Asad Butt
A: 
 public string Format(params string[] value)
 {
            // implementation
 }

The params keyword is used

Dan
A: 
function void MyFunction(string format, params object[] parameters) {

}

Instad of object[] you can use any type your like. The params argument always has to be the last in the line.

Obalix
+2  A: 

A few notes.

Params needs to be marked on an array type, like string[] or object[].

The parameter marked w/ params has to be the last argument of your method. Foo(string input1, object[] items) for example.

bakasan