2012-01-30 23 views
9

を使用して階層に分かれた文字列私は、ドットで区切られた文字列を(「」)持つ文字:スプリットC#とLINQ

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

どのように私は別のに文字列を分割するためにC#とLINQを使用することができますその階層を示す文字列?次のようになります。

答えて

12

異なるレベルの1 ... Nを取り、区切り文字で区切り文字列を分割して再結合します。ここで

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(); 

は、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

エレガントな解決策 –

+0

優れた答え。 linqの解決策は重要です。なぜなら、私はxmlから100を読み込み、それらを一緒に自動生成されたクラスにグループ化するからです。 – sean

0

は、集約を使用するソリューションです:

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

はここで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画家approac hは "super Shlemiel"ストリングよりも優れています。この場合はジョイントしてください。

 const char DELIMITER = '.'; 

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