什么是更有效/更整洁的方法来打破这个字符串?

时间:2011-05-13 08:14:59

标签: c# string optimization

我正在尝试将这个字符串分解为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 个答案:

答案 0 :(得分:7)

你可以使用正则表达式

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可能有更好的方法!

答案 1 :(得分:3)

正则表达式肯定是一种可能性,但它是否“整洁”或更具可读性取决于个人偏好和阅读正则表达式的能力。如果这个实际用例实际上只是读取那些两个颜色而不是任意数量的颜色,那么我可能只是继续使用原始解决方案。如果Regex不是你的强项,那么在保持代码简单的同时避免细微错误的意图非常明确。

LINQ可能是最易读的变体,可以轻松地读取多个键值对,同时仍然使用简单的拆分机制来解析数据。

根据我的经验,为了可维护性你绝对应该避免的是为这个小而简单的问题编写一个非常复杂,通用且看似“整洁”的解决方案。

答案 2 :(得分:2)

您可以使用LINQ方法:

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

话虽如此,我会坚持你的方法。每个人都理解清楚的代码。正则表达式版本和LINQ版本更加模糊......

答案 3 :(得分:1)

检查它与你的要求类似,从而将字典对象形成字符串

Regex To Linq to Dictionary in 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
 */

答案 4 :(得分:0)

如果您知道订单将始终相同。您无论如何都需要使用您的解决方案,您可以这样做:

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