Skip to content
ilyana.dev
TwitterGithubLinkedIn

Creating an Append-Only List Wrapper in C#

software development, coding, testing, c#2 min read

append only list

Sometimes, you need a list, but you don't want people messing with the things you've added once they're added.

I was working on a project recently where I needed exactly this functionality. Towards that end, I created a AppendOnlyStringList wrapper class. There are other ways I could have done this (and if you have other ideas on how to implement this, let me know in the chat below!), but as I'm comfortable with using Lists I decided to take the following approach:

My AppendOnlyStringList has a private List<string> _messages, which can be added to using the public Append(string message) method:

public void Append(string message)
{
_messages.Add(message);
}

AppendOnlyStringList also needed to implement IEnumerable<string> in order for things to "just work" so I could pass around and test my class just as I would if using a List<string>. The implementation of IEnumerable required two methods, which both used _messages to implement them.

The full class ended up looking like this:

public class AppendOnlyStringList : IEnumerable<string>
{
private List<string> _messages = new();
public IEnumerator<string> GetEnumerator()
{
return _messages.GetEnumerator();
}
public void Append(string message)
{
_messages.Add(message);
}
IEnumerator IEnumerable.GetEnumerator()
{
return _messages.GetEnumerator();
}
}

As you can see, this was very easy to implement, as all the methods just used the List<string> functionality.

For good measure, because testing is important, I added a quick test to make sure my class is doing what it's supposed to do and works as expected:

[Fact]
public void AppendsStringsToList()
{
var list = new AppendOnlyStringList();
var testString = "I am a test string";
var anotherTestString = "Look! I'm another test string!";
var oneMoreTestString = "Wow, this is probably overkill, but no matter!";
list.Append(testString);
list.Append(anotherTestString);
list.Append(oneMoreTestString);
Assert.Contains(testString, list);
Assert.Contains(anotherTestString, list);
Assert.Contains(oneMoreTestString, list);
}

Thanks for reading! I hope you find this and other articles here at ilyanaDev helpful! Be sure to follow me on Twitter @ilyanaDev.