2012-01-30 15 views
9

Ho stringa separati da punti ('') caratteri che rappresenta una gerarchia:dividere una stringa separata in gerarchia utilizzando C# e LINQ

string source = "Class1.StructA.StructB.StructC.FieldA"; 

Come posso utilizzare C# e LINQ per dividere la stringa in separata stringhe per mostrare la loro gerarchia? Ad esempio:

string[] result = new string[] 
{ 
    "Class1", 
    "Class1.StructA", 
    "Class1.StructA.StructB", 
    "Class1.StructA.StructB.FieldA" 
}; 

risposta

12

Dividere la stringa in base ai delimitatori prendendo 1 ... N dei diversi livelli e ricongiungersi alla stringa.

const char DELIMITER = '.'; 
var source = "Class1.StructA.StructB.StructC.FieldA"; 
var hierarchy = source.Split(DELIMITER); 
var result = Enumerable.Range(1, hierarchy.Length) 
    .Select(i => String.Join(".", hierarchy.Take(i))) 
    .ToArray(); 

Ecco un modo più efficiente per fare questo senza LINQ:

const char DELIMITER = '.'; 
var source = "Class1.StructA.StructB.StructC.FieldA"; 
var result = new List<string>(); 
for (int i = 0; i < source.Length; i++) 
{ 
    if (source[i] == DELIMITER) 
    { 
     result.Add(source.Substring(0, i)); 
    } 
} 
result.Add(source); // assuming there is no trailing delimiter 
+0

Soluzione elegante –

+0

Risposta eccellente. La soluzione linq è importante perché leggerò 100 di questi da xml e li raggrupperemo in classi generate automaticamente. – sean

0

Ecco soluzione che utilizza l'aggregazione:

const string separator = "."; 
const string source = "Class1.StructA.StructB.StructC.FieldA"; 

// Get the components. 
string[] components = source.Split(new [] { separator }, StringSplitOptions.None); 

List<string> results = new List<string>(); 
// Aggregate with saving temporary results. 
string lastResult = components.Aggregate((total, next) => 
    { 
     results.Add(total); 
     return string.Join(separator, total, next); 
    }); 
results.Add(lastResult); 
0

Ecco una soluzione completamente senza LINQ:

public static string[] GetHierarchy(this string path) 
{ 
    var res = path.Split('.'); 
    string last = null; 
    for (int i = 0; i < res.Length; ++i) 
    { 
     last = string.Format("{0}{1}{2}", last, last != null ? "." : null, res[i]); 
     res[i] = last; 
    } 
    return res; 
} 
0

Shlemiel l'approac del pittore h è migliore della stringa "super Shlemiel". Entra in questo caso.

 const char DELIMITER = '.'; 

     string soFar = ""; 
     List<string> result = source.Split(DELIMITER).Select(s => 
     { 
      if (soFar != "") { soFar += DELIMITER; }; 
      soFar += s; 
      return soFar; 
     }).ToList(); 
Problemi correlati