2011-10-29 26 views
10

を考える:私は週文字列(すなわち"Monday", "Wednesday", "Friday"または"Monday", "Thursday", "Friday", "Sunday")の日のリストを持つことができますので、文字列のコレクションを分割して作成する必要が文字配列を文字列配列に変換するには?

文字列dayCodes(すなわち"MWF"または"MRFU")。

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

問題:

問題は、あなたがChar私は、一方が他方から継承されていないため、理にかなっていると思いますStringにキャストすることができないということです。それでも、コンパイラはを1文字の長さでキャストすると思うでしょう。String

をゼロから作成する必要はありません(Cast<string>()を使用するような)簡単な方法がありますか?

答えて

21

だけでうまくいくchar.ToString()を使用して:

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

、と心の中で、より良いソリューションを使用すると、マッピング用の辞書に直接文字列を使用しない理由:

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

dayMapping は、完全な日の名前にマッピングされます。

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

ここでも魔法の文字列の代わりにSystem.DayOfWeek列挙型を使用することを検討する価値はあります。 – uglybugger

+0

@uglybugger私が作っている方法のポイントは、文字列を連結してもっとコードになるようにすることです(つまり、すべての場合に '.ToString()'を呼び出す必要があります)。 – 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(); 

必要に応じてラムダを別の方法に変更できます。

+0

+1私はあなたを知らなかったlambdasでそれをすることができます。 – James

+0

+1かなりかわいいです。 – DJTripleThreat

1

あなたはこれを行うことができます。

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

出力:説明したよう

enter image description here

1

が検索でこれを見つける人のためのタイトルに質問...(ない問題に答えるために...これは以前の投稿の1つです)

var t = "ABC";
var s = t.ToCharArray()。(c => c.ToString())を選択します。ToArray();