Как преобразовать массив char в массив строк?

Дано:

Строка dayCodes (т.е. "MWF" или "MRFU"), которую мне нужно разбить и создать коллекцию строк, чтобы у меня был список дней строк недели (т.е. "Monday", "Wednesday", "Friday" или "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);

Проблема:

Проблема заключается в том, что вы не можете отбрасывать Char в String, который, как мне кажется, имеет смысл, потому что он не унаследован от другого. Тем не менее, вы думаете, что компилятор будет отличать Char как один символ длиной String.

Есть ли быстрый способ (например, использовать Cast<string>()) для этого, поэтому мне не нужно создавать List<string> с нуля?

Ответ 1

Просто использование char.ToString() будет работать:

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

В качестве альтернативы, и лучшее решение на мой взгляд, почему бы вам не использовать строку непосредственно со словарем для отображения:

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

с dayMapping просто a Dictionary<char, string>, который отображается на полное имя дня:

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

Ответ 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();

Вы можете изменить lambda в отдельный метод, если хотите.

Ответ 3

Вы можете сделать это:

            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

Ответ 4

Чтобы ответить на вопрос в заголовке для тех, кто нашел это в поиске... (не проблема, как описано... это одна из ранних сообщений.)

var t = "ABC",
var s = t.ToCharArray(). Выберите (c = > c.ToString()). ToArray();