2010-01-10 62 views
6

使用.NET MicroFramework,這是一個非常精簡的C#版本。例如,System.String幾乎沒有我們多年來享有的任何好東西。如果String.Split(String [])不存在,您將如何拆分 r n?

我需要將文本文檔分成行,這意味着按\ r \ n分割。但是,String.Split只提供按字符分隔的字符串,而不是字符串。

如何以有效的方式將文檔分成多行(例如,不在文檔中的每個字符上瘋狂循環)?

P.S. System.String也缺少一個Replace方法,所以這不起作用。
P.P.S. Regex也不是MicroFramework的一部分。

+6

它不是C#的精簡版本;它是.NET Framework的一個縮減版本。 –

回答

12

你可以做

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

假設μF支持TRIM()在所有。修剪()將刪除所有空白,這可能是有用的。否則,使用TrimEnd('\r')

+0

是的,這是訣竅,並保持大多數的性能特點。謝謝。很聰明。 – AngryHacker

+0

我正要提出類似的建議 - 打敗我。如果在輸入中'\ n'並不總是以'\ r'開頭,你可能需要重新組合字符串(理論上)。 – LBushkin

2

什麼:

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

或者

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

Readind是.NET Micro Framework 3.0,這個代碼可以工作:

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

它分開由CharArray中的兩個項目分開。因此,除了合法結果之外,您還會得到一堆空的結果。 – AngryHacker

+0

@AngryHacker:RemoveEmptyEntries應該處理它們; –

+0

File.ReadAllLines也不受支持。 – AngryHacker

6

我會在文檔中的每個字符循環,因爲這是明確要求。你認爲String.Split是如何工作的?然而,我會盡力這樣做,但只能擊中每個角色。

保留到目前爲止發現的字符串列表。重複使用IndexOf,將當前偏移量傳入字符串(即前一匹配+2)。

+0

確實如此,但Split(string [])的完整.NET實現使用指針和不安全的代碼來實現它的性能。否則,我會簡單地複製代碼。 我正在運行一個非常低端的芯片,並希望有一些非常聰明的東西。 – AngryHacker

+1

如果只使用一個分隔字符串進行分割,並且分隔符長度超過3個字符,則可以使用Boyer-Moore搜索算法變體之一獲得更好的性能。不是說這有助於海報的問題。 http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – LBushkin

3

如何以有效的方式將文檔分割成行(例如,不在文檔中的每個字符上瘋狂循環)?

您如何看待內置Split的工作原理?

只是將它自己重新實現爲擴展方法。

0

這可能在某些情況下幫助:

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

在哪些情況下?你能提供一些細節嗎? –

0

如果你想要一個MicroFramework兼容分割功能,對整個字符串中的字符的作品,這裏是一個做的伎倆,類似於使用StringSplitOptions的常規框架的版本。無:

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

我想根據[這種可能性]將其轉換爲擴展方法(https://stackoverflow.com/questions/14344668/extension-methods-with-net-micro-framework) – vGHazard

相關問題