Каков более эффективный / аккуратный способ сломать эту строку? - PullRequest
6 голосов
/ 13 мая 2011

Я пытаюсь разбить эту строку на 2 цвета и задаюсь вопросом, есть ли более аккуратный способ достижения того же результата?

// Obtain colour values
string cssConfig = "primary-colour:Red, secondary-colour:Blue";
var parts = cssConfig.Split(',');
var colour1 = parts[0].Split(':')[1];
var colour2 = parts[1].Split(':')[1];

Ответы [ 5 ]

7 голосов
/ 13 мая 2011

Вы можете использовать регулярное выражение

string cssConfig = "primary-colour:Red, secondary-colour:Blue";
var reg = new Regex(@"([\w\-]+)\:([\w\-]+)");
foreach (Match match in reg.Matches(cssConfig))
{

}

Также вы можете сделать что-нибудь с LINQ

    var cssConfigDict = cssConfig.Split(',')
                        .Select(x => x.Split(':'))
                        .ToDictionary(x => x.FirstOrDefault(), y => y.LastOrDefault());

Вероятно, есть лучший способ с LINQ!

3 голосов
/ 13 мая 2011

Regex определенно возможен, хотя, будет ли он «аккуратнее» или более читабельным, зависит от личных предпочтений и вашей способности читать регулярные выражения. Если фактический вариант использования этого действительно просто читает эти два цвета, а не произвольное количество цветов, то я, вероятно, просто останусь с оригинальным решением. Цель ясна при сохранении простоты кода и позволяет избежать мелких ошибок, если регулярные выражения не являются вашей сильной стороной.

LINQ, вероятно, является наиболее читаемым вариантом и легко позволяет считывать несколько пар ключ-значение, все еще используя простой механизм разделения для анализа данных.

Исходя из моего опыта, чего вам определенно следует избегать в целях удобства обслуживания, так это написание чрезвычайно сложного, общего и, казалось бы, "аккуратного" решения для этой маленькой и простой проблемы.

2 голосов
/ 13 мая 2011

Вы можете использовать методы LINQ:

var colors = cssConfig.Split(',').Select(x => x.Split(':').Skip(1).Take(1));

Сказав это, я буду придерживаться вашего метода.Это понятный код, который все понимают.Версия regex и версия LINQ более неясны ...

1 голос
/ 13 мая 2011

Установите этот флажок, чтобы он соответствовал вашему требованию, чтобы получить объект словаря из строки

Regex To Linq to Dictionary в C #

string input = "abc:1|bbbb:2|xyz:45|p:120";
string pattern = @"(?<Key>[^:]+)(?:\:)(?<Value>[^|]+)(?:\|?)";

Dictionary<string, string> KVPs
    = ( from Match m in Regex.Matches( input, pattern )
      select new
      {
          key = m.Groups["Key"].Value,
          value = m.Groups["Value"].Value
       }
       ).ToDictionary( p => p.key, p => p.value );

foreach ( KeyValuePair<string, string> kvp in KVPs )
    Console.WriteLine( "{0,6} : {1,3}", kvp.Key, kvp.Value );

/* Outputs:
 abc :   1
bbbb :   2
 xyz :  45
  p  : 120
 */
0 голосов
/ 13 мая 2011

Если вы знаете, что заказ всегда будет одинаковым. Что бы вам ни понадобилось, чтобы ваше решение работало в любом случае, вы можете сделать:

// Obtain colour values
string cssConfig = "primary-colour:Red, secondary-colour:Blue";
var parts = cssConfig.Split(',',':');
var colour1 = parts[1];
var colour2 = parts[3];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...