2017-01-19 3 views
1

Этот код будет сравнивать usernames и пароли, которые хранятся в текстовом файле. Я думаю, что это из-за цикла for, это, вероятно, просто, но я не могу его видеть.не все пути кода возвращают значение, для цикла

public int loginCheck() 
{ 
    //----------------------------------------------------------------- 
    string[] users = File.ReadLines("Username_Passwords").ToArray(); 
    //line of text file added to array 
    //----------------------------------------------------------------- 

    for (int i = 0; i < users.Length; i++) 
    { 
     string[] usernameAndPassword = users[i].Split('_'); 
     //usernames and passwords separated by '_' in file, split into two strings 

     if (_username == usernameAndPassword[0] && _password == usernameAndPassword[1]) 
     { 
      return 1; 
      //return 1, could have used bool 
     } 
     else 
     { 
      return 0; 
     } 
    } 
+2

Удалить инструкцию else. Если все будет в порядке, оно вернет 1 и остановит цикл. Если нет, программа выходит из цикла и возвращает 0. – MKasprzyk

+0

На самом деле это не отвечает на ваш вопрос, поэтому я не хочу публиковать ответ, но вы можете использовать этот метод с помощью LINQ. public int loginCheck() => File.ReadLines («Username_Passwords»). Выберите (x => x.Split ('_')). Где (x => x.Length == 2) .Any (x => _username == x [0] && _password == x [1])? 1: 0; Я также предлагаю вернуть bool, потому что мы не используем C++. (Изменить: я вижу, что кто-то сказал то же самое.) – Licht

ответ

5

Вы не возвращает никакого значения, если users является пустой массив.

string[] users = File.ReadLines("Username_Passwords").ToArray(); 

// if users is empty, users.Length == 0 and the loop isn't entered 
for (int i = 0; i < users.Length; i++) 
{ 
    ... 
} 

// no value is returned 

return 0; // <- suggested amendment 

вероятно, вы должны добавить return 0; ниже петли

Как дальнейшее улучшение вы можете переписать метод с использованием Linq (возврат 1, если файл содержит любой записи с требуемым имени и пароль, 0 иначе):

public int loginCheck() { 
    return File 
    .ReadLines("Username_Passwords") 
    .Select(line => line.Split('_')) 
    .Any(items => items.Length >= 2 && 
        items[0] == _username && 
        items[1] == _password) 
    ? 1 
    : 0; 
} 
1

Необходимо добавить return 0; после цикла, нет возврата блока не будет достигнуто, если пользователь имеет размер 0.

public int loginCheck() { 
     //----------------------------------------------------------------- 
     string[] users = File.ReadLines("Username_Passwords").ToArray(); 
     //line of text file added to array 
     //----------------------------------------------------------------- 
     for (int i = 0; i < users.Length; i++) { 
      string[] usernameAndPassword = users[i].Split('_'); 
      //usernames and passwords separated by '_' in file, split into two strings 

      if (_username == usernameAndPassword[0] && _password == usernameAndPassword[1]) { 
       return 1; 
       //return 1, could have used bool 
      } 
     } 
     return 0; 
    } 
+0

В вашем коде будет проверяться только первый пользователь. – MKasprzyk

+1

Извиняюсь, я просто исправил заданный вопрос. Я отредактировал ответ, чтобы его отразить. –

+0

это приведет к нескольким возвратам после каждой итерации. –

Смежные вопросы