Преобразование универсального списка к строке CSV

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

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

Каждая ссылка на другой объект использует некоторый идентификатор (как целое число). Каждый раз, когда объект необходим, Вы поиск текущее определение объекта от таблицы. Таблица содержит связанный список для каждого объекта, который содержит все предыдущие версии, наряду с информацией, относительно которой контрольной точки они были активны для.

отмена/восстановление Реализации проста: Сделайте свое действие и установите новую контрольную точку; откатывайте все версии объекта к предыдущей контрольной точке.

Это берет некоторую дисциплину в коде, но имеет много преимуществ: Вам не нужны глубокие копии, так как Вы делаете дифференциальное устройство хранения данных образцового состояния; можно определить объем объема памяти, который Вы хотите использовать ( очень важный для вещей как Модели CAD) или количеством восстановлений или используемой памятью; очень масштабируемые и низкие эксплуатационные расходы для функций, которые воздействуют на модель, так как они не должны делать ничего для реализации отмены/восстановления.

128
задан DenaliHardtail 11 December 2009 в 18:45
поделиться

3 ответа

Удивительно, что Framework уже делает для нас.

List<int> myValues;
string csv = String.Join(",", myValues.Select(x => x.ToString()).ToArray());

Для общего случая:

IEnumerable<T> myList;
string csv = String.Join(",", myList.Select(x => x.ToString()).ToArray());

Как видите, в сущности, ничем не отличается. Помните, что вам может потребоваться заключить x.ToString () в кавычки (то есть "\" "+ x.ToString () +" \ "" ) в случае ] x.ToString () содержит запятые.

Для интересного чтения небольшого варианта этого: см. Comma Quibbling в блоге Эрика Липперта.

Примечание: это было написано раньше. NET 4.0 была официально выпущена. Теперь мы можем просто сказать

IEnumerable<T> sequence;
string csv = String.Join(",", sequence);

, используя перегрузку String.Join (string, IEnumerable ) . Этот метод автоматически проецирует каждый элемент x на x.ToString () .

.
231
ответ дан 24 November 2019 в 00:36
поделиться

Вы можете использовать String.Join .

String.Join(
  ",",
  Array.ConvertAll(
     list.ToArray(),
     element => element.ToString()
  )
);
7
ответ дан 24 November 2019 в 00:36
поделиться

Вы можете создать метод расширения, который можно вызывать в любом IEnumerable:

public static string JoinStrings<T>(
    this IEnumerable<T> values, string separator)
{
    var stringValues = values.Select(item =>
        (item == null ? string.Empty : item.ToString()));
    return string.Join(separator, stringValues.ToArray());
}

Затем вы можете просто вызвать метод из исходного списка:

string commaSeparated = myList.JoinStrings(", ");
10
ответ дан 24 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

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