2012-06-19 119 views
2

此代碼:如何消除foreach循環中的虛假/多餘空間?

const string LabelToFind = "goTo considered Harmful"; 
using (var file = new StreamReader(DownloadedFile)) 
{ 
    string line; 
    while ((line = file.ReadLine()) != null) { 
     if ((line.Contains(keyVal)) && (line.Contains(LabelToFind))) { 
      string[] logLineElements = line.Split('|'); 
      foreach (string element in logLineElements) { 
       if (element.Contains(LabelToFind)) { 
        return element.Substring(element.IndexOf(LabelToFind, StringComparison.Ordinal) + LabelToFind.Length, element.Length - LabelToFind.Length); 
       } 
      } 
     } 
    } 
} 

...失敗「參數超出範圍例外的:索引和長度必須引用位置在字符串中 參數名:長度」,當「元素」具有領先和尾隨空間(它總是這樣做)。我想我能做到這一點:

foreach (string element in logLineElements) { 
    if (element.Contains(LabelToFind)) { 
     String s = element.Trim(); 
     return s.Substring(s.IndexOf(LabelToFind, StringComparison.Ordinal) + LabelToFind.Length, s.Length - LabelToFind.Length); 

...但它不聞吧...

回答

1

您可以分割並且在foreach之前修剪同一時間。

List<string> logLineElements = line.Split('|').Select(e => e.Trim()).ToList(); 
1

在服用子,你開始在你的性格的LabelToFind初審後,但對於長度參數,僅使用element的原始長度減去LabelToFind的長度。如果字符串在element(您認爲始終如此)的開頭以外的其他地方找到,則此操作將失敗,因爲您試圖佔用字符數多於保留字符串的字符數。

假設你想LabelToFind後返回字符串,這是您的代碼會顯示正在嘗試做的,試試:

const string LabelToFind = "goTo considered Harmful"; 
using (var file = new StreamReader(DownloadedFile)) 
{ 
    string line; 
    while ((line = file.ReadLine()) != null) 
    { 
     if (line.Contains(keyVal) && line.Contains(LabelToFind)) 
     { 
      foreach (var element in line.Split('|')) 
      { 
       var index = element.IndexOf(LabelToFind, StringComparison.Ordinal); 
       if (index != -1) 
       { 
        return element.Substring(index + LabelToFind.Length, element.Length - LabelToFind.Length - index).Trim(); 
       } 
      } 
     } 
    } 
} 
+0

我知道;我想知道是否有更好的方法來修剪這個「元素」,而不是我的做法。它的工作原理,但它反而噁心。 –

+0

這實際上很難實現。這似乎是你試圖在元素中獲得LabelToFind之後的所有文本(並且我編輯了我的答案以添加可以使用的代碼)。情況並非如此嗎? – Iridium

+0

是的。如果該行是「goTo認爲有害SitOnASpudBucketOtis」我想要「SitOnASpudBucketOtis」 –