2013-03-22 58 views
2

我是linq的新手,並且這會在空卷字段上彈出。該文件是不可預知的,它會發生,所以我想在出現異常的地方設置0。任何快速簡單的方法來做到這一點?在Linq中處理null

 var qry = 
      from line in File.ReadAllLines("C:\\temp\\T.txt") 
      let myRecX = line.Split(',') 
      select new myRec() 

      { 

       price = Convert.ToDecimal(myRecX[0].Replace("price = ", "")) , 
       volume = Convert.ToInt32(myRecX[1].Replace("volume =", "")), 
       dTime = Convert.ToDateTime(myRecX[2].Replace("timestamp =", "")) 

      }; 
+0

我會考慮使用正則表達式來代替。 – 2013-03-22 18:16:57

+1

你是否得到一個空引用異常或數組索引超出界限異常? – 2013-03-22 18:17:12

+0

*「我想在出現異常的地方放一個0」* - 這看起來不是個好主意?你爲什麼更喜歡*錯誤的數據*? – cdhowie 2013-03-22 18:17:55

回答

4

如果您想使用默認時傳入的數據是null,空,或完全由空白字符,你可以做這樣的:

volume = string.IsNullOrWhitesplace(myRecX[1]) 
     ? defaultVolume // <<== You can use any constant here 
     : Convert.ToInt32(myRecX[1].Replace("volume =", "")) 

然而,這是一個「快速和骯髒」的方式來實現你所需要的,因爲每個命名參數的位置保持硬編碼。更可靠的方法是編寫一個迷你分析器,注意文件中指定的屬性名稱,而不是用空字符串替換它們。

+0

美麗的,我不得不添加替換功能,兩個比較,但工作像一個魅力音量= string.IsNullOrWhiteSpace(myRecX [1] .Replace(「音量=」,「」)) ? 0 // << ==你可以在這裏使用任何常量 :Convert.ToInt32(myRecX [1] .Replace(「volume =」,「」)), – DotNetDudeinDC 2013-03-22 18:33:37

0

你可以使用這樣的事情,它提供了一個表達方式來寫你想要什麼:

static TOutput Convert<TInput, TOutput>(
    TInput value, 
    params Func<TInput, TOutput>[] options) 
{ 
    foreach (var option in options) { 
     try { return option(value); } 
     catch { } 
    } 

    throw new InvalidOperationException("No option succeeded."); 
} 

使用,如:

select new myRec() 
{ 
    price = Convert(myRecX[0].Replace("price = ", ""), 
        input => Convert.ToDecimal(input), 
        or => 0M), 
    ... 
}; 

功能間接和含蓄陣列結構可能會產生輕微的性能會受到損失,但它爲您提供了一種很好的語法,用於指定一些可能的轉換,其中第一個獲得成功。

0

我想這裏有一個超出使用Linq的問題。

一般來說,在處理文件數據之前操作文件數據是不好的做法。

自從如果以下問題是關於文件名(而不是它的內容)是一個很好的起點,瞭解概念消毒輸入

C# Sanitize File Name

所有自己告訴你的代碼後缺少文件內容的控制,使呼叫前:

let myRecX = line.Split(',')

我建議定義一個公開併購方法如:

string SanitizeInputLine(string input) { 
    // here do whatever is needed to bring back input to 
    // a valid format in a way that subsequent calls will not 
    // fail 

    return input; 
} 

應用它很簡單;

let myRecX = SanitizeInputLine(line).Split(',')

作爲一般規則永遠不要相信輸入。

我引述第10章名爲_All輸入是邪惡__的Writing Secure Code霍華德/勒布朗:

...你永遠不應該信任的數據,直到數據被驗證。未能做到 這樣會使您的應用程序易受攻擊。或換句話說:全部 輸入是邪惡的,直到證明