2012-01-30 88 views
9

我具有由點分隔的字符串(「」)字符,它表示一個層次結構中的分離的字符串轉換成層次結構:拆分使用C#和LINQ

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

如何使用C#和LINQ分裂串入單獨的字符串來顯示他們的層次?如:

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

回答

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

優雅的解決方案 – 2012-01-30 07:34:54

+0

出色答卷。 linq解決方案非常重要,因爲我將從xml中讀取100個這些數據,並將它們組合到自動生成的類中。 – sean 2012-01-30 22:09:59

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

史萊米爾畫家平易近人h比「超級Shlemiel」字符串更好。在這種情況下加入。

 const char DELIMITER = '.'; 

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