2011-10-29 27 views
10

Dane:Jak przekonwertować tablicę znaków na tablicę znaków?

Ciąg dayCodes (tj "MWF" lub "MRFU"), że muszę podzielić i stworzyć zbiór ciągów więc mogę mieć listę dniu strun tygodniu (tj "Monday", "Wednesday", "Friday" lub "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); 

Problem:

Problem polega na tym, że nie można rzucać Char do String co chyba ma sens, ponieważ nie jest dziedziczona od drugiego. Nadal można by pomyśleć, że kompilator rzuciłby Char jako jeden znak długi String.

Czy istnieje szybka metoda (na przykład użycie Cast<string>()), aby to zrobić, więc nie muszę tworzyć od podstaw List<string>?

Odpowiedz

21

Wystarczy za pomocą char.ToString() będzie działać:

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

Alternatywnie i lepsze rozwiązanie w moim umyśle, dlaczego nie użyć ciąg bezpośrednio ze słownikiem dla mapowania:

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

z dayMapping po prostu Dictionary<char, string> mapuje na pełną nazwę dnia:

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

Warto rozważyć użycie enum System.DayOfWeek zamiast magicznego łańcucha tutaj. – uglybugger

+0

@uglybugger Zgadzam się, poza tym, że punktem metody, którą tworzę, jest łączenie łańcuchów, więc to po prostu więcej kodu (tj. Wywoływanie '.ToString()' na wszystkim – 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(); 

Możesz zmienić lambdę na osobną metodę, jeśli chcesz.

+0

+1 Nie znałem cię może to zrobić z lambdami. – James

+0

+1 Tak, bardzo śliskie. – DJTripleThreat

1

Można to zrobić:

  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)); 

wyjściowa:

enter image description here

1

Aby odpowiedzieć na pytanie w tytule dla każdego ze znalezieniem tego w poszukiwaniu ... (nie problem, jak opisano ... to jeden z wcześniejszych postów.)

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

Powiązane problemy