Вывести содержимое массива списков в текстовый файл? - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время у меня есть массив списков, как показано здесь:

List<string>[] phase2 = new List<string>[200];

Некоторые из списков внутри инициализируются строками (по 8 в каждом), как показано здесь:

phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
phase2[1] = new List<string>() { "Joe", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
phase2[2] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };

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

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Пожалуйста, смотрите функцию 'ConcatToString' ниже:

void Main()
{
    List<string>[] phase2 = new List<string>[200];

    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Joe", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };

    File.WriteAllText(@"d:\scratch\arrOfWords.txt", ConcatToString(phase2));
}

public string ConcatToString(List<string>[] arrOfWords) 
{
    StringBuilder sb = new StringBuilder();
    foreach(List<string> words in arrOfWords)
    {
        if(words?.Count > 0 ) sb.AppendLine(String.Join(",", words));
    }
    return sb.ToString();
}
0 голосов
/ 02 марта 2019

Как указал @ слегка дрейфующий, при обходе 2D структур данных вам нужно использовать вложенные циклы.Это может быть foreach, традиционный for или даже while, в зависимости от ваших потребностей.

Однако, если вы не беспокоитесь о распределении памяти или производительности (что, кажется,в случае, когда речь идет только о 200 строках), вы можете достичь этого, используя File и LINQ .Обратите внимание, что LINQ предоставляет более удобный для пользователя API, но для этой проблемы он все еще использует вложенные циклы.

Достаточно слов.Вот образец:

private static void WriteToFile(string filePath, List<string>[] content)
{
    using (var fileWriter = new StreamWriter(filePath))
    {
        foreach (var line in content)
        {
            if (line == null)
            {
                continue;
            }

            for (var i = 0; i < line.Count; i++)
            {
                fileWriter.Write(line[i]);

                if (i != line.Count - 1)
                {
                    fileWriter.Write(',');
                }
            }

            fileWriter.WriteLine();
        }
    }
}

private static void WriteToFileOneLiner(string filePath, List<string>[] content)
{
    File.WriteAllLines(filePath, content.Where(line => line != null).Select(line => string.Join(',', line)));
}

public static void Main(string[] args)
{
    List<string>[] phase2 = new List<string>[200];
    phase2[0] = new List<string>() { "Bob", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes", };
    phase2[1] = new List<string>() { "Joe", "Complex", "B", "AOT", "Yes", "Yes", "Yes", "Yes" };
    phase2[2] = new List<string>() { "Bill", "Complex", "A", "AOT", "Yes", "Yes", "Yes", "Yes" };

    WriteToFile(@"C:\Path\to\my\file.txt", phase2);
    WriteToFileOneLiner(@"C:\Path\to\my\file_oneliner.txt", phase2);
}
0 голосов
/ 02 марта 2019

Звучит так, как будто вы хотите использовать «вложенный» цикл foreach, но неясно, хотите ли вы, чтобы они записывали в два отдельных файла, или если вы хотите, чтобы они записывали в один и тот же файл.Я сделаю второй:

foreach (List<string> currentList in phase2)
{
     foreach (string currentElement in currentList)
     {
          //change this out to whatever file output technique you use.               
          Console.Write currentElement + ",";
     }
   //starts a new line
   Console.Write "\n"
}

Это должно дать вам представление о том, куда идти (предполагая, что вы хотите написать содержимое каждого списка в стиле столбцов / строк).Я почти настаиваю на использовании разделителя, если у вас нет особых причин не делать этого.Вы можете использовать любой символ, но придерживаться стандартов (,; | [tab]) для разделения ваших столбцов действительно просто обеспечивает совместимость с будущими приложениями.

Если вы не хотите использовать разделитель, просто удалите+ "," part.

Замените команды Console.Write вашими файлами вывода.

...