C# Different way to join string array

Karen Payne - Sep 3 '23 - - Dev Community

Learn how to create a comma delimited string that goes past using String.Join method.

Code blocks

Rather than use separate methods, all code is presented in the main method of a Console project.

{
  code
}
Enter fullscreen mode Exit fullscreen mode

Where code is isolated from all other code.

Note, index = 1; in this case is out of scope from the assignment.

{
    {
        int index = 0;
    }

    index = 1;
}
Enter fullscreen mode Exit fullscreen mode

Convention method to join

Using String.Join to create a comma delimited string of month names which once joined as a string there is no easy method to modify data e.g. add/remove, in this case a month name.

Console.WriteLine(string.Join(",", 
    DateTimeFormatInfo.CurrentInfo.MonthNames[..^1]));
Enter fullscreen mode Exit fullscreen mode

CommaDelimitedStringCollection

CommaDelimitedStringCollection class provides methods and properties to add, edit, test if values exists, iterate with a for statement and much more.

🛑 Downside and one may guess as the name implies, the delimiter can not be changed from a comma.

Create an instance of CommaDelimitedStringCollection and add month names.

CommaDelimitedStringCollection result = new();
result.AddRange(DateTimeFormatInfo.CurrentInfo.MonthNames[..^1]);
Enter fullscreen mode Exit fullscreen mode

Display the results

Console.WriteLine($"\t{result}");
Enter fullscreen mode Exit fullscreen mode

Remove the current month.

var currentMonthName = 
    DateTime.Now.ToString("MMMM", CultureInfo.InvariantCulture);
result.Remove(currentMonthName);
Enter fullscreen mode Exit fullscreen mode

Insert the current month back in.

result.Insert(DateTime.Now.Month -1, currentMonthName);
Enter fullscreen mode Exit fullscreen mode

What is cool is iterating the collection, in this case month name.

for (var index = 0; index < result.Count; index++)
{
    Console.WriteLine($"{index +1, -3}{result[index]}");
}
Enter fullscreen mode Exit fullscreen mode

Results

1  January
2  February
3  March
4  April
5  May
6  June
7  July
8  August
9  September
10 October
11 November
12 December
Enter fullscreen mode Exit fullscreen mode

Useful for debugging

Example, a developer is testing the following method to find files.

static class FileHelpers
{
    /// <summary>
    /// Find files with no regard to if the user has permissions
    /// </summary>
    /// <param name="path">Folder name to check</param>
    /// <param name="extensions">file extensions</param>
    /// <returns></returns>
    public static string[] FilterFiles(string path, params string[] extensions)
        => extensions
            .Select(filter => $"*.{filter}")
            .SelectMany(item =>
                Directory.EnumerateFiles(
                    path,
                    item,
                    SearchOption.AllDirectories)).ToArray();
}
Enter fullscreen mode Exit fullscreen mode

Rather than using StringBuilder the developer can use CommaDelimitedStringCollection.

{
    AnsiConsole.MarkupLine("[yellow]Files found[/]");
    CommaDelimitedStringCollection result = new();
    var files = FileHelpers.FilterFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory),"txt","json");
    foreach (var file in files)
    {
        result.Add(Path.GetFileName(file));
    }
    Console.WriteLine($"\t{result}");
    Console.WriteLine(result.Contains("appsettings.json").ToYesNo());
}
Enter fullscreen mode Exit fullscreen mode

Using numerics

As the name implies CommaDelimited*StringCollection* there are no overloads for other types but we can simply do a conversion.

For int array, use the following language extension.

static class Extensions
{
    /// <summary>
    /// int array to string array
    /// </summary>
    /// <param name="sender"></param>
    public static string[] ToStringArray(this int[] sender)
        => sender.Select(x => x.ToString()).ToArray();
}
Enter fullscreen mode Exit fullscreen mode

Usage

int[] items = { 1, 2, 3 };
CommaDelimitedStringCollection result = new();
result.AddRange(items.ToStringArray());
Enter fullscreen mode Exit fullscreen mode

Check if 3 is in the collection.

result.Contains("3")
Enter fullscreen mode Exit fullscreen mode

Set to read only

For when the collection should not be modified, use SetReadOnly() method.

{
    AnsiConsole.MarkupLine("[yellow]Files found[/]");
    CommaDelimitedStringCollection result = new();
    var files = FileHelpers.FilterFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory), "txt", "json");
    foreach (var file in files)
    {
        result.Add(Path.GetFileName(file));
    }
    Console.WriteLine($"\t{result}");
    Console.WriteLine(result.Contains("appsettings.json").ToYesNo());

    result.SetReadOnly();
    try
    {
        result.Add("SomeFile.txt");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);

    }
}
Enter fullscreen mode Exit fullscreen mode

Rather than try/catch

result.SetReadOnly();
if (!result.IsReadOnly)
{
    result.Add("SomeFile.txt");
}
Enter fullscreen mode Exit fullscreen mode

screenshot of code samples

Clear the collection

See the Clear method.

Clone the collection

See the Clone method

NuGet packages required

🔸 System.Configuration.ConfigurationManager

Source code

Can be found here which is in a GitHub repository with a mix of other code samples.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .