2016-12-08 2 views
-3

Я пишу приложение I, где пользователь может ввести документ. Затем я читаю каждую строку документа и далее работаю с атрибутами. В каждой строке у нас есть 5 атрибутов. Атрибуты разделяются точкой с запятой.Проверьте, что строка содержит что-то между кавычками

Для примера: Если атрибут имеет semicolo его имя пользователь будет вводить атрибут, то так в документе: «тест, с»

Теперь я хочу, чтобы проверить, если атрибут в кавычках и игнорировать его. Как вы, ребята, это сделаете?

Вот важный фрагмент кода:

foreach (string line in lines) 
{ 
    if (line == "") 
    { 
     continue; 
    } 

    if (lineindex > lines.Length) 
    { 
     continue; 
    } 
    lineindex++; 
    string[] words = line.Split(';'); // i would add here a if statement 
    foreach (string word in words) 
    { 
     count++; 
     if (count == 6) 
     { 
      attribNewValue = ""; 
      maskName = ""; 
      actualAttrbValue = ""; 
      actualAttrbName = ""; 
      attribNameForEdit = ""; 
      count = 1; 
      maskexist = false; 
      attribexist = false; 
     } 
     else 
     { 
      // Or here to each word 
      if (count == 1) 
      { 
       maskName = word; 
      } 
      else if (count == 2) 
      { 
       actualAttrbName = word; 
      } 
      else if (count == 3) 
      { 
       actualAttrbValue = word; 
      } 
      else if (count == 4) 
      { 
       attribNameForEdit = word; 
      } 
      else if (count == 5) 
      { 
       attribNewValue = word; 
      }  
     } 

Спасибо заранее!

+0

, пожалуйста, просмотрите код, который у вас отсутствует. 2 закрывающий '}' один для внутреннего цикла foreach, а другой для внешнего цикла foreach также при использовании функции split, значения в string [] будет проверяться, вы должны действительно подумать о процессе и о том, что вы хотите сделать и реорганизовать этот код. – MethodMan

+0

да, я не добавил весь код, я написал это только его фрагмент кода :) – saamii

+1

Изучите регулярные выражения, это тривиально. –

ответ

3

Вы можете использовать String.IndexOf(char value) и String.LastIndexOf(char value), чтобы определить это:

string[] words; 
int semicolonIndex = line.IndexOf(';'); 
int firstQuoteIndex = line.IndexOf('"'); 
int lastQuoteIndex = line.LastIndexOf('"'); 

if (firstQuoteIndex == lastQuoteIndex) 
    continue; 

if (semicolonIndex > firstQuoteIndex && semicolonIndex < lastQuoteIndex) 
    words = line.Split(';'); 

Дополнительная информация:

IndexOf(): https://msdn.microsoft.com/en-us/library/system.string.indexof(v=vs.110).aspx

LastIndexOf(): https://msdn.microsoft.com/en-us/library/system.string.lastindexof(v=vs.110).aspx

В одном из комментариев упоминалось, это также может быть достигнуто с регулярным e xpressions в гораздо меньшем количестве строк кода, чем мое решение, но оценивая уровень вашего навыка (без обид), я думаю, вам будет легче читать, понимать и начинать с. Независимо от того, есть более элегантное решение, манипуляция строки является довольно основными вещами, и было бы хорошо, чтобы ознакомиться со всеми методами на String классе, как здесь: https://msdn.microsoft.com/en-us/library/system.string_methods(v=vs.110).aspx

Наконец, в то время как это чисто предпочтение разработчика, я бы рекомендовал использовать String.Empty вместо "". Это делает ваши намерения кода более ясными для других читателей/разработчиков. Используя "", можно спросить: «Ну, они ЗНАЧИЛИ использовать пустую строку или сделали опечатку и не назначают то, что, по их мнению, назначают?» Используя String.Empty, нет сомнений в том, что вы хотели использовать пустую строку. Поэтому я бы сделал if (line == String.Empty) continue; вместо if (line == "") continue;