2013-08-05 3 views
0

Я читаю txt-файл, и я хотел бы разделить его на несколько частей. Этот пример моего файла TXT:C# string текст, enum type

"Part error(1) devic[3].data_type(2)" 
"Escape error(3) device[10].data_type(12)" 

Я хочу добиться такой ситуации, что, когда у меня есть первое слово «часть» Я хотел бы иметь тип перечисления для него, и в коммутаторе я хотел бы назвать некоторые функция, которая будет работать со всей строкой, а с другой стороны, когда у меня будет первое слово «Escape», в коммутаторе будет другой случай, который вызовет другие функции. Как мне это сделать? Это мой код до сих пор:

class Row 
{ 
    public enum Category { Part, Escape } 
    public string Error{ get; set; } 
    public string Data_Type { get; set; } 
    public string Device{ get; set; } 
} 

public object HandleRegex(string items) 
{ 
     Row sk = new Row(); 
     Regex r = new Regex(@"[.]"); 
     var newStr = r.Replace(items, @" "); 

     switch(this.category) 
     { 
      case Category.Part: 
       //I want to call here function HandlePart with my line as a parameter 
       HandlePart(newStr); 
       break; 
      case Category.Escape: 
       //Here I want to call Function HandleEscape for line with "Escape" word 
       HandleEscape(newStr); 
       break; 

     } 
} 
+0

Не скобка язык регулярных выражений элемент? Я думаю, вам следует избегать этих персонажей –

ответ

2
public object HandleRegex(string items) 
{   
    Regex r = new Regex(@"[.]"); 
    var newStr = r.Replace(items, @" "); 
    try { 
    category = (Category) new EnumConverter(typeof(Category)).ConvertFromString(items.Split(new string[]{" "},StringSplitOptions.RemoveEmptyEntries)[0]); 
     } 
    catch { 
     throw new ArgumentException("items doesn't contain valid prefix"); 
    } 
    switch(category) 
    { 
     case Category.Part: 
      HandlePart(newStr); 
      break; 
     case Category.Escape: 
      HandleEscape(newStr); 
      break; 
    } 
} 
+0

Но у него много ветвей. Я просто загрузил 2 в качестве примера. Это может быть даже несколько тысяч. – user2592968

+0

@ user2592968 Если это так, вы должны добавить больше записей в 'Category', как минимум 3. –

+0

Произошла ошибка в items.Split ("", StringSplitOptions.RemoveEmptyEntries). У него есть некорректный аргумент. Что это может быть? – user2592968

1

Вы можете использовать TryParse:

Category outCategory; 
Enum.TryParse(this.category, out outCategory) 

switch(outCategory) 
     { 
      case Category.Part: 
       //I want to call here function HandlePart with my line as a parameter 
       HandlePart(newStr); 
       break; 
      case Category.Escape: 
       //Here I want to call Function HandleEscape for line with "Escape" word 
       HandleEscape(newStr); 
       break; 
      default: 
       // Needs to be handled 
     } 
+0

Хорошо, но как я должен делать дифференциацию моего двух случаев? Я имею в виду, как программа будет знать, что, когда она будет читать слово «Part», ей придется называть эту конкретную часть кода? Обычно я читаю каждую строку моего txt-файла. – user2592968

+0

Вам просто нужно прочитать каждую строку и выполнить вышеуказанный код. Или вам нужен код, чтобы получить первое слово? –

+0

Хорошо, я попробую так. – user2592968

0

если вы читаете файл строка за строкой, то вы можете сделать

string str = file.ReadLine(); 
string firstWord = str.substring(0, str.IndexOf(' ')).Trim().ToLower(); 

теперь у вас есть ваш первый слово вы можете сделать

switch(firstWord){ 
    case "escape":// your code 
    case "Part":// your code 
} 
+0

Где сравнить с перечислением? –

+0

нет. но в случае или «побега» пользователь может создать категорию перечисления Escape ... –

1

Вы можете создать Dictionary<Category, Action<string>>, а затем использовать его для вызова кода в соответствии с категорией:

static void Main(string[] args) 
{ 
    var input = @"Part error(1) devic[3].data_type(2) 
Escape error(3) device[10].data_type(12)"; 

    var functions = new Dictionary<Category, Action<string>>() 
    { 
     { Category.Part, HandlePart}, 
     { Category.Escape, HandleEscape } 
    }; 

    foreach (var line in input.Split(new [] {Environment.NewLine }, StringSplitOptions.None)) 
    { 
     Category category; 
     if(Enum.TryParse<Category>(line.Substring(0, line.IndexOf(' ')), out category) && functions.ContainsKey(category)) 
      functions[category](line); 
    } 
} 

static void HandlePart(string line) 
{ 
    Console.WriteLine("Part handler call"); 
} 

static void HandleEscape(string line) 
{ 
    Console.WriteLine("Escape handler call"); 
} 

Выход программы выше:

Part handler call 
Escape handler call 
+0

Это тоже очень хороший способ сделать это. Спасибо! – user2592968