How many times have you written code similar to this?
1: var builder = new StringBuilder();
2: 3: foreach (string foo in bar)
4: { 5: builder.Append(foo); 6: } 7: 8: return builder.ToString();
I have hopefully done it for the last time since I created a couple of extension methods for IEnumerable<string>, well actually, one method with a couple of overloads.
The first one is really simple and just concatenates all the strings in the specified collection to a single string, something like:
1: var sequence = new string[] { "foo", "bar" };
2: string result = sequence.Concatenate();
In this case the result variable will contain the string “foobar”. One of the overloads will let you specify a separator:
1: var sequence = new string[] { "foo", "bar" };
2: string result = sequence.Concatenate(", ");
Now the result is “foo, bar”.
And the last one will let you specify a prefix and a suffix in addition to the separator:
1: var sequence = new string[] { "foo", "bar" };
2: string result = sequence.Concatenate(", ", "(", ")");
Giving you the result “(foo, bar)”. Quite neat!
Here’s the code for the extensions:
1: /// <summary>
2: /// Concatenates all the strings in the specified sequence.
3: /// </summary>
4: /// <param name="values">The values to concatenate.</param>
5: /// <returns>The concatenated sequence.</returns>
6: public static string Concatenate(this IEnumerable<string> values)
7: {8: return values.Concatenate(string.Empty);
9: } 10: 11: /// <summary>
12: /// Concatenates all the strings in the specified sequence, separated by
13: /// the specified separator.
14: /// </summary>
15: /// <param name="values">The values to concatenate.</param>
16: /// <param name="separator">A string that will be inserted between all the values
17: /// in the resulting string.</param>
18: /// <returns>The concatenated sequence, separated by
19: /// the specified separator.</returns>
20: public static string Concatenate(this IEnumerable<string> values, string separator)
21: {22: return values.Concatenate(separator, string.Empty, string.Empty);
23: } 24: 25: /// <summary>
26: /// Concatenates all the strings in the specified sequence, separated by
27: /// the specified separator, prefixed by the value specified in <paramref name="prefix" /> and
28: /// suffixed by the value specified in <paramref name="suffix"/>.
29: /// </summary>
30: /// <param name="values">The values to concatenate.</param>
31: /// <param name="separator">A string that will be inserted between all the values
32: /// in the resulting string.</param>
33: /// <param name="prefix">A string that will be the start of the result string.</param>
34: /// <param name="suffix">A string that will be the end of the result string.</param>
35: /// <returns>The concatenated sequence, separated by
36: /// the specified separator, prefixed by the value specified in <paramref name="prefix" /> and
37: /// suffixed by the value specified in <paramref name="suffix"/>.</returns>
38: public static string Concatenate(this IEnumerable<string> values, string separator, string prefix, string suffix)
39: {40: Guard.ArgumentNullException(values, "values");
41: Guard.ArgumentNullException(separator, "separator");
42: Guard.ArgumentNullException(prefix, "prefix");
43: Guard.ArgumentNullException(suffix, "suffix");
44: 45: var result = new StringBuilder();
46: 47: result.Append(prefix); 48: 49: foreach (var value in values)
50: {51: if (result.Length > prefix.Length)
52: { 53: result.Append(separator); 54: } 55: 56: result.Append(value);
57: } 58: 59: result.Append(suffix); 60: 61: return result.ToString();
62: }… and some NUnit-tests:
1: [TestFixture]2: public class sequence_of_strings_Concatenate
3: {4: string[] sequence;
5: 6: [SetUp]7: public void SetUp()
8: {9: this.OnSetUp();
10: } 11: 12: protected virtual void OnSetUp()
13: {14: sequence = new string[] { "a", "b", "c" };
15: } 16: 17: [Test, ExpectedException(typeof(ArgumentNullException))]
18: public void should_throw_exception_when_sequence_is_null()
19: {20: Legend.Collections.Collection.Concatenate(null);
21: } 22: 23: [Test]24: public void should_concatenate_values()
25: { 26: var result = sequence.Concatenate();27: Assert.AreEqual(result, "abc");
28: } 29: } 30: 31: [TestFixture]32: public class sequence_of_strings_Concatenate_with_specified_separator
33: {34: string[] sequence;
35: 36: [SetUp]37: public void SetUp()
38: {39: this.OnSetUp();
40: } 41: 42: protected virtual void OnSetUp()
43: {44: sequence = new string[] { "a", "b", "c" };
45: } 46: 47: [Test, ExpectedException(typeof(ArgumentNullException))]
48: public void should_throw_exception_when_sequence_is_null()
49: {50: Legend.Collections.Collection.Concatenate(null, ",");
51: } 52: 53: [Test, ExpectedException(typeof(ArgumentNullException))]
54: public void should_throw_exception_when_separator_is_null()
55: {56: sequence.Concatenate(null);
57: } 58: 59: [Test]60: public void should_concatenate_values_separated_by_separator()
61: {62: var result = sequence.Concatenate(", ");
63: Assert.AreEqual(result, "a, b, c");
64: } 65: } 66: 67: [TestFixture]68: public class sequence_of_strings_Concatenate_with_specified_separator_prefix_and_suffix
69: {70: string[] sequence;
71: 72: [SetUp]73: public void SetUp()
74: {75: this.OnSetUp();
76: } 77: 78: protected virtual void OnSetUp()
79: {80: sequence = new string[] { "a", "b", "c" };
81: } 82: 83: [Test, ExpectedException(typeof(ArgumentNullException))]
84: public void should_throw_exception_when_sequence_is_null()
85: {86: Legend.Collections.Collection.Concatenate(null, ",", string.Empty, string.Empty);
87: } 88: 89: [Test, ExpectedException(typeof(ArgumentNullException))]
90: public void should_throw_exception_when_separator_is_null()
91: {92: sequence.Concatenate(null, string.Empty, string.Empty);
93: } 94: 95: [Test, ExpectedException(typeof(ArgumentNullException))]
96: public void should_throw_exception_when_prefix_is_null()
97: {98: sequence.Concatenate(string.Empty, null, string.Empty);
99: } 100: 101: [Test, ExpectedException(typeof(ArgumentNullException))]
102: public void should_throw_exception_when_suffix_is_null()
103: {104: sequence.Concatenate(string.Empty, string.Empty, null);
105: } 106: 107: [Test]108: public void should_concatenate_string_with_separator_prefix_and_suffix_appended()
109: {110: var result = sequence.Concatenate(", ", "(", ")");
111: Assert.AreEqual("(a, b, c)", result);
112: } 113: }
No comments:
Post a Comment