Как преобразовать массив символов в массив строк? - PullRequest
11 голосов
/ 29 октября 2011

Дано:

Строка 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> с нуля?

Ответы [ 4 ]

23 голосов
/ 29 октября 2011

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

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

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

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

с dayMapping просто Dictionary<char, string>, который соответствует полному названию дня:

Dictionary<char, string> dayMapping = new Dictionary<char,string>()
{
    {  'M', "Monday" },
    {  'T', "Tuesday" }
    //and so on
}
2 голосов
/ 29 октября 2011
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();

Вы можете изменить лямбду на отдельный метод, если хотите.

1 голос
/ 15 апреля 2016

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

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

1 голос
/ 29 октября 2011

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

            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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...