2011-10-29 30 views
10

dado:¿Cómo convertir una matriz de caracteres a una matriz de cadenas?

Una cadena dayCodes (es decir "MWF" o "MRFU") que necesito para dividir y crear una colección de cadenas para que pueda tener una lista de los días de la semana las cadenas (es decir "Monday", "Wednesday", "Friday" o "Monday", "Thursday", "Friday", "Sunday").

// this causes a run-time exception because you can't cast Char to String 
var daysArray = days.ToCharArray().Cast<string>().ToArray(); 

// for each dayCode, overwrite the code with the day string. 
for (var i = 0; i < daysArray.Length; i++) 
{ 
    switch (daysArray[i]) 
    { 
     case "M": 
      daysArray[i] = "Monday"; 
      break; 

     case "T": 
      daysArray[i] = "Tuesday"; 
      break; 

     case "W": 
      daysArray[i] = "Wednesday"; 
      break; 

     case "R": 
      daysArray[i] = "Thursday"; 
      break; 

     case "F": 
      daysArray[i] = "Friday"; 
      break; 

     case "S": 
      daysArray[i] = "Saturday"; 
      break; 

     case "U": 
      daysArray[i] = "Sunday"; 
      break; 
    } 
} 

daysArray[daysArray.Length - 1] = "and " + daysArray[daysArray.Length - 1]; 

return string.Join(", ", daysArray); 

Problema:

El problema es que no se puede convertir Char-String que supongo que tiene sentido porque no se hereda de la otra. Aún así, usted pensaría que el compilador emitiría el Char como un carácter largo String.

¿Hay una manera rápida (como usar Cast<string>()) para hacer esto así que no tengo que crear un List<string> desde cero?

Respuesta

21

Simplemente usando char.ToString() funcionaría:

var daysArray = days.ToCharArray().Select(c => c.ToString()).ToArray(); 

Alternativamente, y una mejor solución en mi mente ¿por qué no se utiliza la cadena directamente con un diccionario para la creación de mapas:

var daysArray = days.Select(c => dayMapping[c]).ToArray(); 

con dayMapping solo un Dictionary<char, string> que se asigna al nombre de día completo:

Dictionary<char, string> dayMapping = new Dictionary<char,string>() 
{ 
    { 'M', "Monday" }, 
    { 'T', "Tuesday" } 
    //and so on 
} 
+2

Vale la pena considerar el uso de la enumeración System.DayOfWeek en lugar de una cadena mágica aquí también. – uglybugger

+0

@uglybugger Estoy de acuerdo, excepto que el objetivo del método que estoy haciendo es concatenar cadenas para que sea más código (es decir, tener que llamar a '.ToString()' en todo. – DJTripleThreat

2
char[] daysCodeArray = days.ToCharArray(); 
string[] daysArray = daysCodeArray.Select(el => 
{ 
    switch (el) 
    { 
     case 'M': 
      return "Monday"; 

     case 'T': 
      return "Tuesday"; 

     case 'W': 
      return "Wednesday"; 

     case 'R': 
      return "Thursday"; 

     case 'F': 
      return "Friday"; 

     case 'S': 
      return "Saturday"; 

     case 'U': 
      return "Sunday"; 
    } 
    throw new ArgumentException("Invalid day code"); 
}).ToArray(); 

Puede cambiar la lambda a un método diferente si lo desea.

+0

+1 No te conocía podría hacer eso con lambdas. – James

+0

+1 Sí bastante hábil. – DJTripleThreat

1

Usted puede hacer esto:

  var dayCode = "MWF"; 
      var daysArray = new List<string>(); 
      var list = new Dictionary<string, string>{ 
       {"M", "Monday"}, 
       {"T", "Tuesday"}, 
       {"W", "Wednesday"}, 
       {"R", "Thursday"}, 
       {"F", "Friday"}, 
       {"S", "Saturday"}, 
       {"U", "Sunday"} 
      }; 

      for(int i = 0,max = dayCode.Length; i < max; i++) 
      { 
       var tmp = dayCode[i].ToString(); 
       if(list.ContainsKey(tmp)) 
       { 
        daysArray.Add(list[tmp]); 
       } 
      } 
      Console.WriteLine(string.Join(",", daysArray)); 

Salida:

enter image description here

1

Para responder a la pregunta del título para cualquier persona encontrar esto en una búsqueda ... (no el problema como se describe ... esa es una de las publicaciones anteriores.)

var t = "ABC";
var s = t.ToCharArray(). Seleccione (c => c.ToString()). ToArray();

Cuestiones relacionadas