Что состоит в том, чтобы Представить в виде строки краткий способ. Присоединиться к немассиву строк как во втором примере?
string[] names = { "Joe", "Roger", "John" };
Console.WriteLine("the names are {0}", String.Join(", ", names)); //ok
decimal[] prices = { 39.99M, 29.99m, 29.99m, 19.99m, 49.99m };
Console.WriteLine("the prices are {0}", String.Join(", ", prices)); //bad overload
Если у вас LINQ
:
decimal[] prices = { 39.99M, 29.99m, 29.99m, 19.99m, 49.99m };
Console.WriteLine("the prices are {0}",
String.Join(", ",
prices.Select(p => p.ToString()).ToArray()
)
);
Console.WriteLine("the prices are {0}", String.Join(", ", Array.ConvertAll(prices, p => p.ToString()));
У меня есть две Delimit
функции, которые делают это для меня.
Они занимают очень мало места, так как не создается второй массив, а когда возвращается строка, используется StringBuilder, поэтому она не копирует и не конкатенирует одну и ту же строку, вызывая все большие задержки конкатенации.
Как таковые они полезны для серий очень большой и/или неизвестной длины.
Первый записывает в TextWriter и ничего не возвращает, второй возвращает строку и делегирует первому, передавая StringWriter.
public static void Delimit<T>(this IEnumerable<T> me, System.IO.TextWriter writer, string delimiter)
{
var iter = me.GetEnumerator();
if (iter.MoveNext())
writer.Write(iter.Current.ToString());
while (iter.MoveNext())
{
writer.Write(delimiter);
writer.Write(iter.Current.ToString());
}
}
public static string Delimit<T>(this IEnumerable<T> me, string delimiter)
{
var writer = new System.IO.StringWriter();
me.Delimit(writer, delimiter);
return writer.ToString();
}
Таким образом, учитывая приведенные выше цены, у вас будет
decimal[] prices = { 39.99M, 29.99m, 29.99m, 19.99m, 49.99m };
Console.WriteLine("the prices are {0}", prices.Delimit(", "));
или
decimal[] prices = { 39.99M, 29.99m, 29.99m, 19.99m, 49.99m };
Console.Write("the prices are ")
prices.Delimit(System.Console.Out, ", ");
Console.WriteLine();
Продолжая то, на чем остановился ck, извлеките его в метод, чтобы сделать его многоразовым:
public static class EnumerableExtensions {
public static string Join<T>(this IEnumerable<T> self, string separator) {
if (self == null) throw new ArgumentNullException();
if (separator == null) throw new ArgumentNullException("separator");
return String.Join(separator, self.Select(e => e.ToString()).ToArray());
}
}
Теперь использование более читабельно:
Console.WriteLine("the prices are {0}", prices.Join(", "));
Можно использовать linq для преобразования в строки:
Console.WriteLine("the prices are {0}", String.Join(", ", prices.Select(p => p.ToString()).ToArray()));
или использовать Aggregate () вместо string.Join ()
Console.WriteLine("the prices are {0}",
prices.Select(p => p.ToString()).
.Aggregate((total, p) => total + ", " + p));
или даже (с немного другим форматированием)
Console.WriteLine(
prices.Select(p => p.ToString()).
.Aggregate("the prices are", (total, p) => total + ", " + p));