DEV Community

Karen Payne
Karen Payne

Posted on

C# Different way to join string array

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.

Top comments (0)