2011-05-13 15 views
6

J'essaie de décomposer cette chaîne en 2 couleurs et je me demandais s'il y avait une façon plus facile d'atteindre le même résultat?Quel est le moyen le plus efficace/le plus efficace de briser cette chaîne?

// 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]; 
+2

Que voulez-vous dire par efficace? Moins de code? Moins de temps processeur? Moins d'effort de développement? – PVitt

+0

Tout ce qui précède. Pas si inquiet au sujet du temps de développement cependant. – Andrew

Répondre

7

Vous pouvez utiliser regex

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

} 

vous pouvez aussi faire quelque chose avec LINQ

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

Il y a probablement une meilleure façon avec LINQ!

+0

hmmm deux upvotes mais personne _read_ the regex, du moins pas en ce qui concerne la syntaxe de l'attribut css/style – sehe

+0

La question ne dit pas spécifiquement qu'il est CSS il se peut que ce soit une chaîne qui va devenir CSS – Dve

+0

Votre droit ce n'est pas juste css une chaîne qui est stockée dans la base de données (déjà formée de cette façon) – Andrew

2

Vous pouvez utiliser les méthodes LINQ:

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

Cela dit, je tiendrais avec votre méthode. C'est un code clair que tout le monde comprend. La version regex et la version LINQ est plus obscure ...

+0

+1 pour vous conseiller de rester fidèle à sa méthode – Gabriel

1

Vérifiez ce son similaire à votre exigence, pour obtenir l'objet de dictionnaire former la chaîne

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 
*/ 
0

Si vous savez que le l'ordre sera toujours le même. Que vous auriez besoin pour votre solution pour travailler de toute façon, vous pouvez faire:

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

Un Regex est certainement une possibilité, bien que ce soit « plus propre » ou plus lisible dépend de la préférence personnelle et votre capacité à lire les expressions régulières . Si le cas d'utilisation réel est vraiment juste de lire ces deux couleurs et pas une quantité arbitraire de couleurs alors je resterais probablement juste avec la solution originale. L'intention est assez claire tout en gardant le code simple et évite les erreurs subtiles si Regex ne sont pas votre point fort. LINQ est probablement la variante la plus lisible et permettrait facilement de lire plusieurs paires clé-valeur tout en utilisant un mécanisme de division simple pour analyser les données. D'après mon expérience, ce que vous devez absolument éviter pour des raisons de maintenabilité est d'écrire une solution extrêmement complexe, générique et apparemment «soignée» pour un problème aussi petit et simple.

Questions connexes