Что состоит в том, чтобы Представить в виде строки лучший способ. Присоединиться к немассиву строк?

Что состоит в том, чтобы Представить в виде строки краткий способ. Присоединиться к немассиву строк как во втором примере?

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
5
задан Edward Tanguay 6 July 2010 в 15:08
поделиться

5 ответов

Если у вас 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()
    )
);
13
ответ дан 18 December 2019 в 07:53
поделиться
Console.WriteLine("the prices are {0}", String.Join(", ", Array.ConvertAll(prices, p => p.ToString()));
4
ответ дан 18 December 2019 в 07:53
поделиться

У меня есть две 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();
2
ответ дан 18 December 2019 в 07:53
поделиться

Продолжая то, на чем остановился 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(", "));
1
ответ дан 18 December 2019 в 07:53
поделиться

Можно использовать 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));
0
ответ дан 18 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: