Запятая «Изинг» список предметов

Это Python; все идет . Подумайте, как опубликовать свою документацию . Докстоны невидимы, за исключением читателей вашего исходного кода.

Люди действительно любят просматривать и искать документацию в Интернете. Для этого используйте инструмент документации Sphinx . Это де-факто стандарт для документирования проектов Python. Продукт прекрасен - посмотрите на https://python-guide.readthedocs.org/en/latest/ . На веб-сайте «Чтение документов» будут размещены ваши документы бесплатно.

13
задан Daniel Fortunov 28 April 2009 в 19:37
поделиться

10 ответов

Существует несколько способов сделать это, но они - в основном вариации на тему.

Псевдокод:

For Each Item In Collection:
  Add Item To String
  If Not Last Item, Add Comma

А другой способ, которым мне нравится немного лучше, является чем-то вроде этого:

For Each Item In Collection:
  If Not First Item, Add Comma
  Add Item To String

Редактирование: причина мне нравится второй способ сделать его, состоит в том, что каждый объект стоит самостоятельно. Используя первый подход при изменении логики позже так, чтобы последующий объект не мог бы быть добавлен, Вы могли заканчивать со случайной запятой в конце строки, если Вы также не сделали свой тест в предыдущем объекте более интеллектуальным, который является немым.

1
ответ дан GalacticCowboy 29 April 2009 в 06:37
поделиться
  • 1
    Да, хотя it' s перечисленный как ошибки разработки и тестирование, поэтому если они не тестировали / dev против напоминания, оно должно быть прекрасным. На производстве это пронзило бы ЦП плохо, но восстановилось бы. – Andrew 11 February 2010 в 20:04

или можно сделать:

Separator = ""
For Each Item In Collection
  Add Separator + Item To String
  Separator = ", "

установка By разделитель к пустой строке в первом повторении Вы пропускаете первую запятую. Один меньше, если оператор. Этот мог бы или не мог бы быть более читаемым в зависимости от того, что Вы привыкли к

1
ответ дан Mendelt 29 April 2009 в 06:37
поделиться
Dim Result As String
Dim Items As New List(Of String)
Items.Add("Hello")
Items.Add("World")

Result = String.Join(",", Items.ToArray())
MessageBox.Show(Result)

, Если Вы действительно обеспокоены пустыми строками, используйте эту функцию соединения:

Function Join(ByVal delimiter As String, ByVal items As IEnumerable(Of String), Optional ByVal IgnoreEmptyEntries As Boolean = True) As String
    Dim delim As String = ""
    Dim result As New Text.StringBuilder("")

    For Each item As String In items
        If Not IgnoreEmptyEntries OrElse Not String.IsNullOrEmpty(item) Then
            result.Append(delim).Append(item)
            delim = delimiter
        End If
    Next
    Return result.ToString()
End Function
32
ответ дан Joel Coehoorn 29 April 2009 в 06:37
поделиться

Продолжение от Строки. Ответ соединения, для игнорирования пустого указателя/пустых строк (и если Вы используете.NET 3.5) Вы могли бы использовать немного Linq., например,

Dim Result As String
Dim Items As New List(Of String)
Items.Add("Hello")
Items.Add("World")
Result = String.Join(",", Items.ToArray().Where(Function(i) Not String.IsNullOrEmpty(i))
MessageBox.Show(Result)
5
ответ дан Paul Nearney 29 April 2009 в 06:37
поделиться
  • 1
    Это работало в тестовой среде - там какие-либо риски для выполнения этого в Производстве? – Simon Mark Smith 11 February 2010 в 20:04

Как это:

lstItems.ToConcatenatedString(s => s, ", ")

, Если Вы хотите проигнорировать пустые строки как в Вашем примере:

lstItems
    .Where(s => s.Length > 0)
    .ToConcatenatedString(s => s, ", ")

самая популярная пользовательская агрегатная функция на моей панели инструментов. Я использую его каждый день:

public static class EnumerableExtensions
{

    /// <summary>
    /// Creates a string from the sequence by concatenating the result
    /// of the specified string selector function for each element.
    /// </summary>
    public static string ToConcatenatedString<T>(
        this IEnumerable<T> source,
        Func<T, string> stringSelector)
    {
        return EnumerableExtensions.ToConcatenatedString(source, stringSelector, String.Empty);
    }

    /// <summary>
    /// Creates a string from the sequence by concatenating the result
    /// of the specified string selector function for each element.
    /// </summary>
    /// <param name="separator">The string which separates each concatenated item.</param>
    public static string ToConcatenatedString<T>(
        this IEnumerable<T> source,
        Func<T, string> stringSelector,
        string separator)
    {
        var b = new StringBuilder();
        bool needsSeparator = false; // don't use for first item

        foreach (var item in source)
        {
            if (needsSeparator)
                b.Append(separator);

            b.Append(stringSelector(item));
            needsSeparator = true;
        }

        return b.ToString();
    }
}
5
ответ дан Pete Montgomery 29 April 2009 в 06:37
поделиться
  • 1
    Я don' t знают, как Вы погуглили бы его. Я просто, оказалось, знал этого. Но наверху той страницы (разделяют 6.7) перечисляет грамматику всех выражений, которые допустимы в OCaml, поэтому если Вы хотите понять выражение, можно запустить там сначала, и если Вы видите, что он прокручивает вниз к соответствующей части, которая описывает его. И в целом, Глава 6 имеет дело с различными аспектами грамматики языка OCaml; существуют разделы, имеющие дело с выражениями типа, шаблонами, классами, модулями, и т.д. Таким образом, если бы необходимо искать что-нибудь, что я запустил бы в соответствующем разделе там сначала. – newacct 1 June 2009 в 04:13

Вы полагали бы, что существует класс в платформе.NET, которая обеспечивает эту функциональность?

public static string ListToCsv<T>(List<T> list)
        {
            CommaDelimitedStringCollection commaStr = new CommaDelimitedStringCollection();

            list.ForEach(delegate(T item)
            {
                commaStr.Add(item.ToString());
            });


            return commaStr.ToString();
        }
1
ответ дан edosoft 29 April 2009 в 06:37
поделиться

Спасибо за все ответы.

кажется, что "надлежащий" ответ зависит от контекста, в котором создается список разделенных запятой значений. У меня нет аккуратного списка объектов для использования (должен был использовать что-то для примера...), но у меня действительно есть массив, объекты которого могут или не могут быть добавлены к разделенному списку запятой в зависимости от различных условий.

, Таким образом, я выбрал что-то к эффекту


strResult = ""
strSeparator = ""
for i as integer = 0 to arrItems.Length - 1
  if arrItems(i) <> "test" and arrItems(i) <> "point" then
    strResult = strResult & strSeparator & arrItem(i)
    strSeparator = ", "
  end if
next

, Как обычно, существуют многочисленные методы выполнения этого. Я не знаю, что любой метод заслуживает большего количества похвалы или продвижения, чем другой. Некоторые более полезны в определенных контекстах, в то время как другие удовлетворяют требования различных контекстов.

Снова, благодаря всем для Вашего входа.

BTW, исходное сообщение с "первое, что пришло на ум" примером кода не фильтрует нулевые объекты длины, вместо этого это ожидает строки результата для становления больше, чем нулевая длина прежде, чем добавить запятую. Вероятно, не очень эффективный, но я have'nt протестировал его. Снова, это было первое, что пришло на ум.

0
ответ дан user21826 29 April 2009 в 06:37
поделиться
Dim strResult As String = ""
Dim separator = ","
Dim lstItems As New List(Of String)
lstItems.Add("Hello")
lstItems.Add("World")
For Each strItem As String In lstItems
     strResult = String.Concat(strResult, separator)
Next
strResult = strResult.TrimEnd(separator.ToCharArray())
MessageBox.Show(strResult)

идея состоит в том, чтобы использовать String.TrimEnd() function

0
ответ дан Siddharth Rout 29 April 2009 в 06:37
поделиться

Имеется ли в решении для использования метода StringBuilder или Concat ?

Если нет, вы можете использовать статический метод String.Join . Например (в C #):

string result = String.Join(",", items.ToArray());

См. мой очень похожий вопрос для более подробной информации по этому вопросу.

10
ответ дан 1 December 2019 в 17:26
поделиться

Если у вас нет , у вас для использования метода StringBuilder или Concat , вы также можете использовать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Configuration;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            CommaDelimitedStringCollection commaStr = new CommaDelimitedStringCollection();
            string[] itemList = { "Test1", "Test2", "Test3" };
            commaStr.AddRange(itemList);
            Console.WriteLine(commaStr.ToString()); //Outputs Test1,Test2,Test3
            Console.ReadLine();
        }
    }
}

Это требует ссылка на System.Configuration

2
ответ дан 1 December 2019 в 17:26
поделиться