Cross platform .NET standard 1 native comma delimited data types for C# .NET core, .net framework, andriod, xamarin.
The primary purpose of the library is to allow you to accept parameters using comma delimited or pipe delimited values and to assign those values immediately to a string[] in the constructor of your class.
public class CreateUser
{
public string[] Roles { get; }
public CreateUser(string name, string password, PipeDelimUpper roles) {
Name = name;
Password = password;
Roles = roles;
}
// . . .
}
var createFred = new CreateUser("Fred", "pa$$w0rd", "admin|guest|writer|reports");
createFred.Roles[1] == "GUEST";**The 6 main Comma Delimited data types are as follows
CommaDelimCommaDelimLowerCommaDelimUpperPipeDelimPipeDelimLowerPipeDelimUpper
Install
dotnet add package `Goblinfactory.Delimited`Example 1 - C#9 records
In the example below, the default CommaDelim data type is being used.
public record Cat(CommaDelim Kittens);
var cat = new Cat("Mike, Bob, ,Ginger");
cat.Kittens.Should().BeEquivalentTo(new[] {
"Mike",
"Bob",
"",
"Ginger"
});Default behavior is
- Leading and trailing whitespace is trimmed.
- Empty items are converted to empty strings.
- Case is left as-is.
- No escaping of any delimiter characters are available. The assumption is that you have parsed (or encoded) the values yourself.
- Base class
DelimBaseis available if you need any alternative behavior.
CommaDelim is enumerable
CommaDelim kittens = "Mike, Bob, ,Ginger";
foreach(var cat in kittens) {
Console.WriteLine(cat);
}
... produces
Mike
Bob
[empty line]
GingerDelimited strings using comma (,). Whitespace is removed.
CommaDelim cd = "12 3, aB , 6";
cd.ToString().Should().Be("12 3,aB,6");
cd[1] == "aB"public record Cat(CommaDelim Kittens);
var cat = new Cat("Mike, Bob,, Ginger");
cat.Kittens[3] == "Ginger";Delimited strings using comma (,). Whitespace is removed. Values are converted to Invariant Uppercase.
CommaDelimUpper cdu = "12 3, aB , 6";
cdu.ToString().Should().Be("12 3,AB,6");
cdu[1] == "AB"public record Cat(CommaDelimUpper Kittens);
var cat = new Cat("Mike, Bob,, Ginger");
cat.Kittens[3] == "GINGER";Delimited strings using comma (,). Whitespace is removed. Values are converted to Invariant lowercase.
CommaDelimLower cdl = "12 3, aB , 6";
cdl.ToString().Should().Be("12 3,ab,6");
cdl[1] == "ab"public record Cat(CommaDelimUpper Kittens);
var cat = new Cat("Mike, Bob,, Ginger");
cat.Kittens[3] == "ginger";Delimited strings using Pipe (|). Whitespace is removed.
PipeDelim pd = "12 3| aB | 6";
pd.ToString().Should().Be("12 3|aB|6");
pd[1] == "aB"public record Cat(PipeDelim Kittens);
var cat = new Cat("Mike| Bob||Ginger");
cat.Kittens[1] == "Bob";Delimited strings using Pipe (|). Whitespace is removed. Values are converted to Invariant uppercase.
PipeDelimUpper pdu = "12 3| aB | 6";
pdu.ToString().Should().Be("12 3|AB|6");
pdu[1] == "AB"public record Cat(PipeDelimUpper Kittens);
var cat = new Cat("Mike| Bob||Ginger");
cat.Kittens[3] == "GINGER";Delimited strings using Pipe (|). Whitespace is removed. Values are converted to Invariant lowercase.
PipeDelimLower pdl = "12 3| aB | 6";
pdl.ToString().Should().Be("12 3|ab|6");
pdl[1] == "ab"public record Cat(PipeDelimLower Kittens);
var cat = new Cat("Mike| Bob||Ginger");
cat.Kittens[3] == "ginger";Typical pattern for assigning CommaDelim properties to string[] arrays works as follows;
public class Cat
{
public string[] Kittens;
public Cat(CommaDelim kittens) {
Kittens = kittens;
}
}
var cat = new Cat("Mike, Bob,,Ginger");
cat.Kittens[3] == "ginger";All the Delimited types work with all versions of C#. I've purely used C#9 record types above to simplify the documentation.
- Use an empty string to represent an empty array. e.g.
var cat = new Cat("");You cannot use null to represent an empty string, because the compiler cannot tell what type you mean when you write a null on it's own.
var cat = new cat(null); <-- Will give you object null exception.
var cat = new cat((string)null) <-- will be converted into an empty array without errorThe reason for the above behavior is because there are three legitimate types that can be passed as a property as an initialiser. While Cat has been defined as taking a CommaDelim type as it's first property in the constructor, that means you can pass in
- string
- string[] or
- a
CommaDeliminstance.
When passing a null the compiler can't which of these three you mean, and the compiler does not know that it wouldn't make any difference in this particular case.
If you want to use stronger type constructs like Pipe and Comma delimiters, I highly recommed you investigate using the new C# 8 language feature -> nullable and non nullable reference types. It opens the door for creating new classes that you want to treat as native language constructs.
https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references