2013-12-01 2 views
3

У меня есть следующий фрагмент кода, который открывает файл и считывает все строки в файле и сохраняет его в массив строк.проверить, существует ли строка в файле

Которая затем проверяет, присутствует ли строка в массиве. Однако проблема, с которой я столкнулся, заключается в том, что всякий раз, когда строка найдена, она всегда показывает «есть совпадение», а также «нет совпадения». Любая идея, как это исправить?

проверить этот код:

using (StreamReader sr = File.OpenText(path)) 
{ 
    string[] lines = File.ReadAllLines(path); 
    for (int x = 0; x < lines.Length - 1; x++) 
    { 
     if (domain == lines[x]) 
     { 
      sr.Close(); 
      MessageBox.Show("there is a match"); 
     } 
    } 
    if (sr != null) 
    { 
     sr.Close(); 
     MessageBox.Show("there is no match"); 
    } 
} 

ответ

3

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

using (StreamReader sr = File.OpenText(path)) 
{ 
    string[] lines = File.ReadAllLines(path); 
    bool isMatch = false; 
    for (int x = 0; x < lines.Length - 1; x++) 
    { 
     if (domain == lines[x]) 
     { 
      sr.Close(); 
      MessageBox.Show("there is a match"); 
      isMatch = true; 
     } 
    } 
    if (!isMatch) 
    { 
     sr.Close(); 
     MessageBox.Show("there is no match"); 
    } 
} 

Удачи!

+0

работает как очарование! Спасибо за помощь! – BryanZest

+0

Добро пожаловать! – gpmurthy

13

Звучит слишком сложным, нет причин, чтобы проверить по линии или что-нибудь, если вы хотите знать, если строка присутствует в файле. Вы можете заменить весь код просто с:

if(File.ReadAllText(path).Contains(domain)) 
{ 
    MessageBox.Show("There is a match"); 
} 
-1

Вы можете попробовать этот код:

using (StreamReader sr = File.OpenText(path)) 
         { 
          string[] lines = File.ReadAllLines(path); 
          for (int x = 0; x < lines.Length - 1; x++) 
          { 
           if (lines[x].Contains(domain, StringComparison.InvariantCultureIgnoreCase) 
           { 
            sr.Close(); 
            MessageBox.Show("there is a match"); 
           } 
          } 
          if (sr != null) 
          { 
           sr.Close(); 
           MessageBox.Show("there is no match"); 
          } 
         } 
+0

Это все равно покажет диалог «нет совпадения», даже если совпадение найдено. Если вы хотите выделить использование 'string.Contains()', я бы уточнил ответ. – chwarr

1

На самом деле вам не нужно читать весь файл в памяти. Существует метод File.ReadLines, который позволяет перечислить строки файлов один за другим, не читая весь файл. Вы можете создать следующий метод

private bool DomainExists(string domain) 
{ 
    foreach(string line in File.ReadLines(path)) 
     if (domain == line) 
      return true; // and stop reading lines 

    return false; 
} 

Использование этого метода выглядит следующим образом:

if (DomainExists(domain)) 
    MessageBox.Show("there is a match"); 
else 
    MessageBox.Show("there is no match"); 

также две боковых ноты - вам не нужно StreamReader, если вы читаете строки с File.ReadAllLines (он создает читатель внутренне) , Просто проверьте - вы даже не используете sr переменную в любом месте. И второе примечание - вам не нужно вручную закрывать поток, если вы завернули его в блок using. В этом случае поток будет автоматически удален и закрыт.

0

Простейший способ:

string content = File.ReadAllText(path); 
if (content.IndexOf(domain) > -1) 
{ 
    // domain exists 
} 
else 
{ 
    // domain does not exist 
} 

и теперь анализировать код:

первый, вы создаете StreamReader экземпляр, но не использовать его в коде.

2-ое, а что, если доменное имя имеет множественное вхождение в файл? В вашем коде вы получите несколько «совпадений» в вашем коде.

using (StreamReader sr = File.OpenText(path)) // you can remove this line 
{ 
    string[] lines = File.ReadAllLines(path); // as you are not using it here 
    for (int x = 0; x < lines.Length - 1; x++) 
    { 
     if (domain == lines[x]) 
     { 
      sr.Close(); 
      MessageBox.Show("there is a match"); 
      hasMatch = true; 
      break; // exit loop if found 
     } 
    } 

    if (!hasMatch) 
    { 
     // there is no match 
    } 

    if (sr != null) // you dont need this if you remove it from the beginning of the code 
    { 
     sr.Close(); 
     MessageBox.Show("there is no match"); 
    } 
} 
Смежные вопросы