CS1929 — Попытка прочитать файл, перейти к строке, содержащей определенную строку, и вернуть содержимое этой строки

#c#

Вопрос:

Ошибка возникает в методе SkipWhile, во втором ключевом слове «строка». Отображает следующий журнал

CS1929 «символ» не содержит определения для «Содержит» и лучшей перегрузки метода расширения», которую можно запросить.Содержит(IQueryable, строка)» требуется приемник типа «IQueryable»

     public static void loginEmployee(string user, string password)
    {
        string filename = "servidores_cadastrados_db_backup.txt";
        string path = AppConfig.appconfig.defaultPath;
        path = Path.Combine(path, filename);

        if (File.ReadAllText(path).Contains(user))
        {

            employee.Registration = File.ReadAllText(path).SkipWhile(line => !line.Contains(user))
            .TakeWhile(line => !line.Contains(user));
        }
        else
        {
            MessageBox.Show("Invalid User or Password..", "Invalid Login", MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }
    }
 

Комментарии:

1. ReadAllText возвращает 1 строку, а не список строк

2. ReadAllText предоставляет вам все содержимое файла в виде одной строки. Если вы хотите работать с линиями, я бы, вероятно, рекомендовал вам вместо этого переключиться на ReadAllLines . Кроме того, вместо того, чтобы дважды читать все содержимое файла, вероятно, перейдите прямо к вашему SkipWhile / TakeWhile коду, а затем определите, не вернуло ли это никаких строк.

3. Звучит как очень небезопасный способ тестирования безопасности — если вводимый текст содержит панель управления именем пользователя, а проверяемое имя пользователя-FOO или BAR, оба будут найдены при тестировании для пользователя. Хотя я понимаю, что это не ваш вопрос.

4. Это не совсем безопасно, но это всего лишь прототип. Спасибо за замечание. Я еще раз взгляну на это.

Ответ №1:

Вы используете File.ReadAllText , а затем используете SkipWhile то, что вернет каждый символ текста. То, что вы должны использовать File.ReadLines , — это повторение строк.

 employee.Registration = File.ReadLines(path).SkipWhile(line => !line.Contains(user))
        .TakeWhile(line => !line.Contains(user));
 

Кроме того, я думаю, что вы .TakeWhile(line => !line.Contains(user) ошибаетесь, разве это не должно пытаться соответствовать user , а не не совпадать?

 employee.Registration = File.ReadLines(path).SkipWhile(line => !line.Contains(user))
        .TakeWhile(line => line.Contains(user));
 

Комментарии:

1. Эй. Это был не совсем правильный ответ, но он направил меня на путь к правильному ответу. Спасибо. Кроме того,». takeWhile()» на самом деле был неправильным.