2012-01-30 33 views
9

Tôi có chuỗi phân cách bằng dấu chấm ('') nhân vật đại diện cho một hệ thống phân cấp:chia một chuỗi tách thành hệ thống phân cấp sử dụng C# và LINQ

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

Làm thế nào tôi có thể sử dụng C# và LINQ để phân chia các chuỗi vào riêng biệt dây để hiển thị hệ thống phân cấp của họ? Chẳng hạn như:

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

Trả lời

12

Tách chuỗi bằng dấu phân cách lấy 1 ... N của các cấp khác nhau và tham gia lại chuỗi.

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

Đây là một cách hiệu quả hơn để làm điều này mà không 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

Giải pháp thanh lịch –

+0

Câu trả lời hay. Giải pháp LINQ là quan trọng bởi vì tôi sẽ đọc 100 trong số này từ xml và nhóm chúng lại với nhau thành các lớp được tạo tự động. – sean

0

Đây là giải pháp mà sử dụng kết hợp:

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

Dưới đây là một giải pháp hoàn toàn mà không 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 họa sĩ approac h là tốt hơn so với "siêu Shlemiel" string.Join trong trường hợp này.

 const char DELIMITER = '.'; 

     string soFar = ""; 
     List<string> result = source.Split(DELIMITER).Select(s => 
     { 
      if (soFar != "") { soFar += DELIMITER; }; 
      soFar += s; 
      return soFar; 
     }).ToList(); 
Các vấn đề liên quan