C# params Keyword with Collections
Last modified April 19, 2025
This tutorial explores how to use the params
keyword in C# with
various collection types like List<T>
,
Span<T>
, and IEnumerable<T>
.
In C# 13, the params
keyword has been extended to support
additional collection types beyond arrays, enabling more flexible and efficient
method parameter handling.
Understanding the params Keyword in C#
The params
keyword allows a method to accept a variable number of
arguments, which are treated as a collection inside the method. With C# 13,
params
now supports types like List<T>
,
Span<T>
, IEnumerable<T>
, and others, in addition
to arrays.
Key characteristics of params
:
- It must be the last parameter in the method signature.
- Only one
params
parameter is allowed per method. - It supports specific collection types like
List<T>
orSpan<T>
. - It allows zero or more arguments to be passed.
Using params with Array
This example demonstrates params
with an array to calculate the
average.
double Average(params int[] numbers) { return numbers.Length > 0 ? numbers.Average() : 0; } int[] values = { 4, 8, 12 }; Console.WriteLine(Average(1, 2, 3)); Console.WriteLine(Average(values));
The Average
method computes the average of a variable number of
integers or an array passed directly.
$ dotnet run 2 8
Using params with List<T>
This example uses params
with a List<int>
to sum
numbers.
int SumNumbers(params List<int> numbers) { return numbers.Sum(); } Console.WriteLine(SumNumbers(1, 2, 3)); Console.WriteLine(SumNumbers(10, 20, 30, 40)); Console.WriteLine(SumNumbers());
The SumNumbers
method accepts a variable number of integers as a
List<int>
and returns their sum.
$ dotnet run 6 100 0
Using params with Span<T>
This example uses params
with a Span<string>
to
concatenate strings.
string ConcatStrings(params Span<string> words) { return string.Join(" ", words.ToArray()); } Console.WriteLine(ConcatStrings("Hello")); Console.WriteLine(ConcatStrings("C#", "is", "awesome")); Console.WriteLine(ConcatStrings());
The ConcatStrings
method joins strings from a
Span<string>
, handling any number of inputs.
$ dotnet run Hello C# is awesome
Using params with IEnumerable<T>
This example combines a fixed parameter with a params
IEnumerable<string>
parameter.
void PrintItems(string category, params IEnumerable<string> items) { Console.WriteLine($"Category: {category}"); foreach (var item in items) { Console.WriteLine($" - {item}"); } } PrintItems("Fruits", new[] { "Apple", "Banana", "Orange" }); PrintItems("Tools", "Hammer", "Screwdriver");
The PrintItems
method takes a category and a variable number of
items as an IEnumerable<string>
, printing them in a list.
$ dotnet run Category: Fruits - Apple - Banana - Orange Category: Tools - Hammer - Screwdriver
Using params with ReadOnlySpan<T>
This example demonstrates params
with a
ReadOnlySpan<object>
.
void DisplayValues(params ReadOnlySpan<object> values) { foreach (var value in values) { Console.WriteLine($"Value: {value}"); } } DisplayValues(42, "Hello", 3.14, true); DisplayValues("Test", 100);
The DisplayValues
method accepts a variable number of objects as a
ReadOnlySpan<object>
, displaying each one.
$ dotnet run Value: 42 Value: Hello Value: 3.14 Value: True Value: Test Value: 100
Passing a Collection to params
This example shows passing a List<int>
to a
params
List<int>
parameter.
int MaxValue(params List<int> numbers) { return numbers.Any() ? numbers.Max() : 0; } Listvalues = [5, 2, 8, 1, 9]; Console.WriteLine(MaxValue(1, 2, 3)); Console.WriteLine(MaxValue(values));
The MaxValue
method finds the maximum value from a variable number
of integers or a List<int>
passed directly.
$ dotnet run 3 9
Best Practices
When using params
with collections in C#:
- Choose the appropriate collection type (e.g.,
Span<T>
for performance). - Handle empty collections gracefully in method logic.
- Avoid overloading with
params
to prevent ambiguity. - Use specific types over
object
for type safety.
Source
params keyword - language reference
This tutorial has demonstrated how to use the params
keyword in C#
with various collection types for flexible method parameters.
Author
List all C# tutorials.