About string concatenation there are many articles already have been posted in the web. There are many arguments about string concatenation, for example some people says we should not use +, some says use string.join or StringBuilder. I think all are right because usage of different techniques depend on the situation and expected performance really. I reflect the string.concat method using .Net reflector then found
Collapse
return (arg0.ToString() + arg1.ToString());
code in where they use + so then whats wrong with the + ? Off course there are performance issues with +.
So I have created few extensions of string to do the concatenation operation which I include below,
Collapse
public static class StringExtensions
{
public static string JoinWithSeparator(this string baseItem, string firstItem, string separator = default(string))
{
return string.Join(separator: separator, value: new[] { baseItem, firstItem });
}
public static string JoinWithSeparator(this string baseItem, string firstItem, string secondItem, string separator = default(string))
{
return string.Join(separator: separator, value: new[] { baseItem, firstItem, secondItem });
}
public static string JoinWithSeparator(this string baseItem, string[] items, string separator = default(string))
{
return string.Join(separator, new[] { baseItem, string.Join(separator: separator, value: items) });
}
public static string JoinWith(this string baseItem, string[] items, string separator = default(string))
{
var builder = new StringBuilder();
Array.ForEach(items,
item =>
{
builder.Append(value: item).Append(separator);
});
return ReferenceEquals(separator, default(string)) ? builder.ToString() : builder.ToString().TrimEnd(separator.ToCharArray());
}
public static string JoinWithDifferentTypes
where T1 : struct
where T2 : struct
where T3 : class
{
var builder = new StringBuilder();
builder.Append(baseItem).Append(tupleOfJoinableItems.Item1).Append(tupleOfJoinableItems.Item2);
return ReferenceEquals(tupleOfJoinableItems.Item3, null) ? builder.ToString() : builder.Append(tupleOfJoinableItems.Item3.ToString()).ToString();
}
}
in the above code I used string.Join and StringBuilder to join with given strings and also I wrote extension named JoinWithDifferentTypes by which I tried to use multiple types to join into one string item. In the JoinWithDifferentTypes method I could also use
Collapse
return string.Format("{0}{1}{2}{3}", baseItem, tupleOfJoinableItems.Item1, tupleOfJoinableItems.Item2, tupleOfJoinableItems.Item3);
to describe the usage of the above extension methods I used following code blocks,
Collapse
static void Main(string[] args)
{
string[] items = new string[] { "One-", "Two-", "Three" };
string baseItem = "Zero";
Console.WriteLine("Results :\n {0}\n {1}\n {2}\n {3}\n {4}\n {5}\n {6}\n {7}",
new object[]
{
baseItem.JoinWithSeparator("One", Definitions.Separator),
baseItem.JoinWithSeparator("One", "Two", Definitions.Separator),
baseItem.JoinWithSeparator(new[] { "One", "Two" }, Definitions.Separator),
baseItem.JoinWith(Definitions.Topics.Split(new[] { ',' }), Definitions.Separator),
baseItem.JoinWith(Definitions.Topics.Split(new[] { ',' })),
baseItem.JoinWithDifferentTypes
baseItem.JoinWithDifferentTypes
});
Console.ReadKey();
}
JoinWithSeparator
There are three overloaded versions and all of those have a common behavior which is the separator and it optional. Beside that if I want to join with a single item I could use JoinWithSeparator extension for example, "JoinWith".JoinWithSeparator("Me") or if want to add two items with separator then "JoinWith".JoinWithSeparator("A","B",Definitions.Separator). This extension is preferable for the circumstances where we need to add One or Two items with baseItem.
JoinWith
The JoinWith extension will take an array of string tokens and will add those with the baseitem. If we need to add many items then we should use this extension.
JoinWithDifferentTypes
If we want to add different types of items into the baseItem (which is string in here) then we can use this one.
and some other related classes I used,
Collapse
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public override string ToString()
{
return Name.JoinWith(Address);
}
}
public class Definitions
{
public const string
Separator = "-",
Topics = "Programming, Music, Documentary";
}
No comments:
Post a Comment