ASP.NET StreamWriter - новая строка после x запятых - PullRequest
0 голосов
/ 05 августа 2010

У меня есть массив JS, который пишет в текстовый файл на сервере с помощью StreamWriter.Это строка, которая делает это:

sw.WriteLine(Request.Form["seatsArray"]);

В данный момент записывается одна строка со всем содержимым массива.Я хочу, чтобы новая строка писалась после каждых 5 запятых.Пример массива:

BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,

Должен вывести:

BN,ST,A1,303,601,
BN,ST,A2,303,621,
BN,WC,A3,303,641,

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

Как я могу это сделать?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Хорошо, вот самый простой ответ , который я могу себе представить:

string[] bits = Request.Form["seatsArray"].Split(',');

for (int i = 0; i < bits.Length; i++)
{
    sw.Write(bits[i]);
    sw.Write(",");
    if (i % 5 == 4)
    {
        sw.WriteLine();
    }
}

Это не очень элегантно, но, я думаю, оно выполнит свою работу.1007 * После этого вы можете захотеть завершить текущую строку, если это необходимо:

if (bits[i].Length % 5 != 0)
{
    sw.WriteLine();
}

Я уверен, что есть более умные способы ... но это просто.

Один вопрос: значения всегда длиной три символа?Потому что если это так, вы просто разбиваете строку на каждые 20 символов ...

0 голосов
/ 05 августа 2010

Что-то вроде:

var input = "BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,";
var splitted = input.Split(',');

var cols = 5;
var rows = splitted.Length / cols;

var arr = new string[rows, cols];

for (int row = 0; row < rows; row++)
    for (int col = 0; col < cols; col++)
        arr[row, col] = splitted[row * cols + col];

Я постараюсь найти более элегантное решение. Надлежащим образом с функциональным стилем.

Обновление: Просто узнайте, что это на самом деле не то, что вам нужно. При этом вы получите двумерный массив с 3 строками и 5 столбцами.

Это, однако, даст вам 3 строки. У них нет окончания ','. Ты хочешь это? Вы всегда хотите распечатать это? Или вы хотите иметь доступ к различным строкам?:

var splitted = input.Split(new [] { ','}, StringSplitOptions.RemoveEmptyEntries); 

var lines = from item in splitted.Select((part, i) => new { part, i })
            group item by item.i / 5 into g
            select string.Join(",", g.Select(a => a.part));

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

public static class LinqExtensions
{
    public static IEnumerable<IList<T>> Chunks<T>(this IEnumerable<T> xs, int size)
    {
        int i = 0;

        var curr = new List<T>();

        foreach (var x in xs)
        {
            curr.Add(x);

            if (++i % size == 0)
            {
                yield return curr;
                curr = new List<T>();
            }
        }
    }
}

Использование:

var lines = input.Split(',').Chunks(5).Select(list => string.Join(",", list));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...