2014-03-27 26 views
1

我在写C#的方法是转换机场滑行道从他们的orignial格式的书面出来的版本之中......这样的例子:解析机场滑行道标签

AA将写作ALPHA ALPHA

F1FOXTROT 1

看看更多的例子洛杉矶机场图:https://www.dropbox.com/s/8614gp41dwnwvsm/klax.PDF

这是我迄今为止:

public static string ParseTaxiway(string taxiway) 
{ 
    string twy = ""; 
    var alpha = Regex.Match(taxiway, "([A-Z]){1,2}"); 
    var alphanum = Regex.Match(taxiway, "([A-Z])([1-9])"); 

    // do we have an alpha character only taxiway? 
    if(alpha.Success) 
    { 
     switch(alpha.Groups[1].Value) 
     { 
      case "A": 
       twy = "ALPHA"; 
       break; 
      case "B": 
       twy = "BRAVO"; 
       break; 
      case "C": 
       twy = "CHARLIE"; 
       break; 
      case "D": 
       twy = "DELTA"; 
       break; 
      case "E": 
       twy = "ECHO"; 
       break; 
      case "F": 
       twy = "FOXTROT"; 
       break; 
      case "G": 
       twy = "GOLF"; 
       break; 
      case "H": 
       twy = "HOTEL"; 
       break; 
      case "I": 
       twy = "INDIA"; 
       break; 
      case "J": 
       twy = "JULIET"; 
       break; 
      case "K": 
       twy = "KILO"; 
       break; 
      case "L": 
       twy = "LIMA"; 
       break; 
      case "M": 
       twy = "MIKE"; 
       break; 
      case "N": 
       twy = "NOVEMBER"; 
       break; 
      case "O": 
       twy = "OSCAR"; 
       break; 
      case "P": 
       twy = "PAPA"; 
       break; 
      case "Q": 
       twy = "QUEBEC"; 
       break; 
      case "R": 
       twy = "ROMEO"; 
       break; 
      case "S": 
       twy = "SIERRA"; 
       break; 
      case "T": 
       twy = "TANGO"; 
       break; 
      case "U": 
       twy = "UNIFORM"; 
       break; 
      case "V": 
       twy = "VICTOR"; 
       break; 
      case "W": 
       twy = "WHISKEY"; 
       break; 
      case "X": 
       twy = "XRAY"; 
       break; 
      case "Y": 
       twy = "YANKEE"; 
       break; 
      case "Z": 
       twy = "ZULU"; 
       break; 
     } 
    } 

    // taxiway with letter and number; A1, F5, B6, etc 
    if(alphanum.Success) 
    { 
     switch (alphanum.Groups[1].Value) 
     { 
      case "A": 
       twy = "ALPHA " + alphanum.Groups[2].Value); 
       break; 
      case "B": 
       twy = "BRAVO " + alphanum.Groups[2].Value); 
       break; 
      case "C": 
       twy = "CHARLIE " + alphanum.Groups[2].Value); 
       break; 
      case "D": 
       twy = "DELTA " + alphanum.Groups[2].Value); 
       break; 
      case "E": 
       twy = "ECHO " + alphanum.Groups[2].Value); 
       break; 
      case "F": 
       twy = "FOXTROT " + alphanum.Groups[2].Value); 
       break; 
      case "G": 
       twy = "GOLF " + alphanum.Groups[2].Value); 
       break; 
      case "H": 
       twy = "HOTEL " + alphanum.Groups[2].Value); 
       break; 
      case "I": 
       twy = "INDIA " + alphanum.Groups[2].Value); 
       break; 
      case "J": 
       twy = "JULIET " + alphanum.Groups[2].Value); 
       break; 
      case "K": 
       twy = "KILO " + alphanum.Groups[2].Value); 
       break; 
      case "L": 
       twy = "LIMA " + alphanum.Groups[2].Value); 
       break; 
      case "M": 
       twy = "MIKE " + alphanum.Groups[2].Value); 
       break; 
      case "N": 
       twy = "NOVEMBER " + alphanum.Groups[2].Value); 
       break; 
      case "O": 
       twy = "OSCAR " + alphanum.Groups[2].Value); 
       break; 
      case "P": 
       twy = "PAPA " + alphanum.Groups[2].Value); 
       break; 
      case "Q": 
       twy = "QUEBEC " + alphanum.Groups[2].Value); 
       break; 
      case "R": 
       twy = "ROMEO " + alphanum.Groups[2].Value); 
       break; 
      case "S": 
       twy = "SIERRA " + alphanum.Groups[2].Value); 
       break; 
      case "T": 
       twy = "TANGO " + alphanum.Groups[2].Value); 
       break; 
      case "U": 
       twy = "UNIFORM " + alphanum.Groups[2].Value); 
       break; 
      case "V": 
       twy = "VICTOR " + alphanum.Groups[2].Value); 
       break; 
      case "W": 
       twy = "WHISKEY " + alphanum.Groups[2].Value); 
       break; 
      case "X": 
       twy = "XRAY " + alphanum.Groups[2].Value); 
       break; 
      case "Y": 
       twy = "YANKEE " + alphanum.Groups[2].Value); 
       break; 
      case "Z": 
       twy = "ZULU " + alphanum.Groups[2].Value); 
       break; 
     } 
    } 

    return twy; 
} 

我与此遇到的问题是,如果我有一个滑行道标记AA,它只会返回ALPHA。滑行道限制为一个或两个字母长带一个数字(1-9)的一个字母。 R,AA,AC,D1,ZZ等等,所以有很多组合。

如果有人能指导我正确地创建这个解析方法的正确路径,我将不胜感激。

回答

2

该方法试图减少样板代码的数量。

public static class Taxiway 
{ 
    private static Dictionary<char, string> lookup = 
     new string[] 
     { 
      "ALPHA", 
      "BRAVO", 
      "CHARLIE", 
      ... 
      "ZULU" 
     } 
     .Concat(Enumerable.Range(1, 9).Select(n => n.ToString())) 
     .ToDictionary(s => s[0]); 

    public static string Parse(string s) 
    { 
     if (s == null || s.Length < 1 || s.Length > 2 
      || !s.All(c => lookup.ContainsKey(c)) 
      || !char.IsLetter(s[0])) 
     { 
      throw new ArgumentException("Invalid taxiway.", "s"); 
     } 
     return string.Join(" ", s.Select(c => lookup[c])); 
    } 
} 

Taxiway.Parse("W5")会给你"WHISKEY 5"
Taxiway.Parse("C")会给你"CHARLIE"
Taxiway.Parse("CA")会给你"CHARLIE ALPHA",等等。

它只会接受下列形式之一的字符串:
"{A-Z}""{A-Z}{A-Z}""{A-Z}{1-9}"

另外:ParseX提出了一种将string转换为X的方法。你可能想考虑一个不同的名字。

+0

伟大的工程...但是,我现在的问题(我应该包括在我原来的问题中)是如果我有一个句子的滑行道。例如'TWY C5 CLSD。 TWY C10 AND TWY C5 CLSD' ...我想改写成TWY CHARLIE 5 CLSD。 TWY CHARLIE 10和TWY CHARLIE 5 CLSD' – Zach

+0

@Zach 1.将'if'条件的否定取出到一个单独的IsMatch方法中,该方法接受一个字符串并返回一本书。 2.将你的句子拆分为空格字符。 3.对于每个拆分字符串,如果它是IsMatch,请将其替换为Parse。 4.用空格连接拆分字符串以重建句子。 –

+0

@Zach此外,您的示例引用了与您的规格不符的“C10”。 –

0

这些家伙谈论做一些PHP称为strtr()的东西。基本上你给它一个字符串,并返回字符的翻译。这是这种类型的东西真的很方便:

http://forums.devshed.com/programming-42/equalvilent-method-strtr-functon-php-541398.html

否则,你可以尝试使用有序字典所有字母/数字字典一维的,像这样:

OrderedDictionary alphas = new OrderedDictionary(); 

// add your alphas 
alphas.Add("A", "ALPHA"); 
alphas.Add("B", "BRAVO"); 
..etc 

然后引用他们通过索引来建立你的字符串(alpha是你的正则表达式的单个字符值)

twy = alphas[alpha] + alphanum.Groups[2].Value; 

对于你想要的做,建立一个字符串,这种方法将保存一些代码,并且不需要业务逻辑。

+0

我意识到,你也不用担心,如果你的第2个字符是数字或字母数字字符。我不确定你是如何确定你是否有第二个字符,但你可以做一个简单的布尔值,如'if(second_character_is_numeric_condition){alphas + alphanum.Groups [2] .Value; } else {twy = alphas [first_char_reference] + alphas [second_char_reference]; ''。无论如何,希望这是有帮助的。 –

0

你可以存储在字典中的代码和翻译,然后使用LINQ到每个字符翻译:

var dict = new Dictionary<char, string> 
{ 
    { 'A', "ALPHA" }, 
    { 'B', "BRAVO" }, 
    ... 
    { 'F', "FOXTROT" }, 
    ... 
    { '1', "1" }, 
    { '2', "2" }, 
    ... 
}; 

var code = "AA"; 

var translation = string.Join(" ", code.Select(c => dict[c])); 

输出:

ALPHA ALPHA // AA 

FOXTROT 1  // F1 
1

键/值映射刚存入字典和逐字地循环输入字符串以获取单词并创建最终输出。

var dictionary = new Dictionary<char, string>(); 

dictionary.Add('A', "Alpha"); 
// and so on.. 

public static string ParseTaxiway(string taxiway) 
{ 
string finalValue = ""; 

foreach (var character in taxiway) 
{ 
    finalValue += dictionary[character] +" "; 
} 

return finalValue; 
} 
0

这里是一个存根

enum MyEnum 
{ 
    ALPHA, 
    BRAVO 
} 
String taxiNo= "AB"; 
String convertedString = ""; 
if(taxiNo.Length == 0) 
{ 
    // throw exception 
} 
else 
    convertedString = ((MyEnum)((int)(taxiNo.ToCharArray()[0])-65)).ToString(); 
if(taxiNo.Length == 2) 
{ 
    int justForCheck; 
    if(!int.TryParse(taxiNo.Substring(1,1),out justForCheck)) 
     convertedString += " " + ((MyEnum)((int)(taxiNo.ToCharArray()[1])-65)).ToString(); 
    else 
     convertedString += " " + taxiNo[1].ToString(); 
}