什么是更有效/更整洁的方法来分解这个字符串

本文关键字:分解 字符串 方法 有效 什么 | 更新日期: 2023-09-27 17:56:24

我正在尝试将这根字符串分解为 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];

什么是更有效/更整洁的方法来分解这个字符串

你可以使用正则表达式

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

正则表达式绝对是一种可能性,尽管它是"更整洁"还是更具可读性取决于个人喜好和您阅读正则表达式的能力。如果它的实际用例真的只是读取这两种颜色而不是任意数量的颜色,那么我可能会保留原始解决方案。意图非常明确,同时保持代码简单,如果正则表达式不是您的强项,则可以避免细微的错误。

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

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

您可以使用 LINQ 方法:

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

话虽如此,我会坚持你的方法。这是每个人都能理解的清晰代码。正则表达式版本和 LINQ 版本更加晦涩难懂...

检查它是否与您的要求类似,以从字符串中获取字典对象

正则表达式到 Linq 到 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
 */

如果您知道顺序将始终相同。无论如何,您的解决方案都需要工作,您可以执行以下操作:

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