Как прочитать 3 строки текстового файла c# - PullRequest
2 голосов
/ 13 марта 2020

Я разработал программу, которая читает заданную c строку текстового файла, но я хочу прочитать 3 строки и поместить их в текстовое поле, например, прочитать строки 1, 3 и 5 только из текстового файла. Спасибо

Это код, который я хочу изменить, чтобы прочитать больше , чем одну строку, а не одну строку

  private void Button1_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();
        string text = System.IO.File.ReadAllText(openFileDialog1.FileName);
        string line = File.ReadLines(openFileDialog1.FileName).Skip(2).FirstOrDefault();
        TextBox1.Text = line;
    }

Ответы [ 3 ]

4 голосов
/ 14 марта 2020

Попробуйте Where, т. Е.

string[] lines = File
  .ReadLines(openFileDialog1.FileName)
  .Take(5) // optimization: we want 5 lines at most 
  .Where((line, index) => index == 0 || index == 2 || index == 4)
  .ToArray();

. Обратите внимание, что index соответствует нулю ( 1-я строка имеет index == 0). В случае произвольных индексов

HashSet<int> indexes = new HashSet<int>() {0, 2, 4};

string[] lines = File
  .ReadLines(openFileDialog1.FileName)
  .Take(indexes.Max() + 1) // optimization 
  .Where((line, index) => indexes.Contains(index))
  .ToArray();
1 голос
/ 14 марта 2020

System.IO.File.ReadLines () возвращает IEnumerable.

При этом вы можете использовать такие вещи, как использование .ElementAt (index) для получения определенных c строк, хотя помните о первых line - это индекс 0. Таким образом, для вашего примера вам нужны индексы 0, 2 и 4.

0 голосов
/ 14 марта 2020

Where и Contains ваши друзья здесь:

Where имеет перегрузку, которая принимает индекс массива в качестве второго аргумента.

var indicesToTake = new int[] { 1, 3, 5 };
string[] lines = File
  .ReadLines(openFileDialog1.FileName)
  .Where((x, i) => indicesToTake.Contains(i))
  .ToArray();

string fullText = string.Join(System.Environment.NewLine, lines); // and TextBox1.Text = fullText;
// or TextBox1.Lines = lines

, вы также можете построить диапазон индексов, который вы хотите с помощью linq, например, если вы хотите, чтобы все нечетные индексы были в диапазоне от 1 до 100:

var indicesToTake = Enumerable.Range(100).Where(i => i % 2 == 1);

Как писал Дмитрий Быченко, вы можете использовать другие приемы оптимизации (Take, чтобы не проверять все массив, особенно если вы хотите строки с индексом ниже 10, но вы хотите гораздо больше строк после последней)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...