2010-01-10 30 views
6

Sử dụng .NET MicroFramework là phiên bản thực sự được cắt giảm của C#. Ví dụ: System.String hầu như không có bất kỳ sản phẩm nào mà chúng tôi đã thích trong những năm qua.Làm thế nào bạn sẽ chia cho r n nếu String.Split (String []) không tồn tại?

Tôi cần phải chia tài liệu văn bản thành các dòng, có nghĩa là chia nhỏ theo \ r \ n. Tuy nhiên, String.Split chỉ cung cấp một phân chia bằng char, không phải bằng chuỗi.

Làm cách nào để chia tài liệu thành các dòng theo cách hiệu quả (ví dụ: không lặp điên cuồng trên mỗi char trong tài liệu)?

P.S. System.String cũng thiếu phương thức Replace, vì vậy nó sẽ không hoạt động.
P.P.S. Regex cũng không phải là một phần của MicroFramework.

+6

Nó không phải là phiên bản cắt xuống của C#; đó là một phiên bản cắt giảm của .NET Framework. –

Trả lời

12

Bạn có thể làm

string[] lines = doc.Split('\n'); 
for (int i = 0; i < lines.Length; i+= 1) 
    lines[i] = lines[i].Trim(); 

Giả sử rằng các μF hỗ trợ Trim() ở tất cả. Trim() sẽ xóa tất cả khoảng trắng, điều đó có thể hữu ích. Nếu không sử dụng TrimEnd('\r')

+0

Đúng, điều này thực hiện thủ thuật và giữ hầu hết các đặc tính hiệu suất. Cảm ơn. Khá thông minh. – AngryHacker

+0

Tôi vừa định đề nghị một cái gì đó như thế này - đánh tôi với cú đấm. Bạn có thể cần phải kết hợp lại các chuỗi (về mặt lý thuyết) nếu '\ n' không phải lúc nào cũng được bắt đầu bởi '\ r' trong đầu vào. – LBushkin

2

gì về:

string path = "yourfile.txt"; 
string[] lines = File.ReadAllLines(path); 

Hoặc

string content = File.ReadAllText(path); 
string[] lines = content.Split(
    Environment.NewLine.ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries); 

readind rằng .NET Micro Framework 3.0, mã này có thể làm việc:

string line = String.Empty; 
StreamReader reader = new StreamReader(path); 
while ((line = reader.ReadLine()) != null) 
{ 
    // do stuff 
} 
+0

Nó chia tách riêng cho cả hai mục trong CharArray. Vì vậy, bạn sẽ nhận được một loạt các kết quả trống ngoài các kết quả hợp pháp. – AngryHacker

+0

@AngryHacker: RemoveEmptyViệc nên xử lý chúng; –

+0

File.ReadAllLines không được hỗ trợ. – AngryHacker

6

tôi sẽ lặp qua mỗi char trong tài liệu, bởi vì đó là yêu cầu rõ ràng. Làm thế nào để bạn nghĩ rằng String.Split hoạt động? Tôi sẽ cố gắng làm như vậy chỉ đánh mỗi nhân vật một lần, tuy nhiên.

Giữ danh sách các chuỗi được tìm thấy từ trước tới nay. Sử dụng liên tục IndexOf, chuyển giá trị hiện tại vào chuỗi (tức là kết quả phù hợp trước đó + 2).

+0

Đúng, nhưng việc thực thi .NET đầy đủ (chuỗi []) sử dụng con trỏ và mã không an toàn để đạt được hiệu suất mà nó thực hiện. Nếu không, tôi chỉ đơn giản là sẽ sao chép mã. Tôi đang vận hành trên một con chip cực kỳ thấp và hy vọng có thứ gì đó cực kỳ thông minh. – AngryHacker

+1

Nếu bạn chỉ tách một chuỗi ký tự phân cách duy nhất và dấu phân cách dài hơn 3 ký tự, bạn có thể nhận được hiệu suất tốt hơn bằng cách sử dụng một trong các biến thể thuật toán tìm kiếm Boyer-Moore. Không phải là nó giúp vấn đề của poster, trong trường hợp này. http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – LBushkin

3

Làm cách nào để chia tài liệu thành các dòng một cách hiệu quả (ví dụ: không lặp điên cuồng trên mỗi char trong tài liệu)?

Bạn nghĩ việc tích hợp sẵn Split hoạt động như thế nào?

Chỉ cần tự mình thực hiện lại như một phương pháp mở rộng.

0

Điều này có thể giúp đỡ trong một số kịch bản:

StreamReader reader = new StreamReader(file);  
string _Line = reader.ReadToEnd(); 
string IntMediateLine = string.Empty; 
IntMediateLine = _Line.Replace("entersign", ""); 
string[] ArrayLineSpliter = IntMediateLine.Split('any specail chaarater'); 
+0

Trong trường hợp nào? Bạn có thể cung cấp một số chi tiết xin vui lòng. –

0

Nếu bạn muốn một MicroFramework tương thích chức năng chia mà làm việc cho toàn bộ một chuỗi ký tự, đây cũng là loại hiện các trick , tương tự như phiên bản khung thông thường sử dụng StringSplitOptions.None:

private static string[] Split(string s, string delim) 
    { 
     if (s == null) throw new NullReferenceException(); 

     // Declarations 
     var strings = new ArrayList(); 
     var start = 0; 

     // Tokenize 
     if (delim != null && delim != "") 
     { 
      int i; 
      while ((i = s.IndexOf(delim, start)) != -1) 
      { 
       strings.Add(s.Substring(start, i - start)); 
       start = i + delim.Length; 
      } 
     } 

     // Append left over 
     strings.Add(s.Substring(start)); 

     return (string[]) strings.ToArray(typeof(string)); 
    } 
+0

Tôi đã nghĩ về việc chuyển nó thành Phương thức mở rộng theo [khả năng này] (https://stackoverflow.com/questions/14344668/extension-methods-with-net-micro-framework) – vGHazard

Các vấn đề liên quan