2011-05-29 76 views
-1

可能重複:
linq query and nullsLINQ查詢並再次空

這會引發空異常,如果是一些在XML文件中的元素缺失的 - 我不想得到這個例外 - 我想添加空字符串列表數據旁邊缺失元素

InstrumentDescription inputFile = InstrumentDescription.Load(openFileDialog1.FileName);  
var queryManufacturer = from dataManufaturer in 
            inputFile.Identification.Manufacturers.Manufacturer 
          select new 
          { 
           dataManufaturer.name, 
           dataManufaturer.cageCode, 
           dataManufaturer.FaxNumber, 
           dataManufaturer.URL.OriginalString 
          }; 


    foreach (var a in queryManufacturer) 
    { 
     data.Add(a.name); 
     if (a.cageCode == null) data.Add(""); 
     else data.Add(a.cageCode); 
     if (a.FaxNumber == null) data.Add(""); 
     else data.Add(a.FaxNumber); 
     if (a.OriginalString == null) data.Add(""); 
     else data.Add(a.OriginalString); 
    } 

我試過somen這樣的事情 - 但它不起作用

select new 
{ 
    name = dataManufaturer.name ?? "", 
    cageCode = dataManufaturer.cageCode ?? "", 
    FaxNumber = dataManufaturer.FaxNumber ?? "", 
    OriginalString = dataManufaturer.URL!=null ? dataManufaturer.URL.OriginalString : "" 
}; 

我想有一個空字符串,如果一些元素丟失,不會得到異常。


我解決了它!

在選擇我只用select new { dataManufacturer }不是這些所有可能的元素,當我加入這裏僅列出測試,如果例如dataManufacturer.name爲空或不是

+3

這並不完全清楚XML到底發生了什麼,也不完全是NullReferenceException發生的地方。請參閱http://tinyurl.com/so-hints – 2011-05-29 08:33:26

+0

Xml - 我有一個XSD方案翻譯成代碼 - 在我稱之爲加載的代碼中 - 我工作的很好,當我讀取文件中的所有元素時,但至少有至少一個丟失,它拋出異常後選擇 - 添加任何東西沒有列出 – 2011-05-29 08:38:52

+0

我能看到的唯一的原因是,如果'dataManufaturer.URL.OriginalString'中的URL爲空。但是當你添加select語句時,你說它沒有工作?你有沒有得到相同的錯誤或其他東西?除非整個dataManufaturer爲空。 – aL3891 2011-05-29 08:44:04

回答

0

我如何

var queryManufacturer = from dataManufaturer in input.Identification.Manufacturers.Manufacturer 
where dataManufaturer != null 
select {...} 
+0

不,dataManufacturer從不爲空 - 只是其中一些元素可能爲空 – 2011-05-29 08:51:34

1

很將在這裏發佈這個「評論」作爲CW,以幫助您找到正確的方向找到問題的根源。

在這個代碼塊中,空引用異常將在這裏發生的地方有太多的潛在原因。在你的其他問題中看看你的回答,很明顯你不知道如何找出問題所在。所以試試看這個。這是您向我們展示的代碼的重寫形式,以便於找出null的位置。運行它來查明發生了什麼,希望你能夠自己修復它。如果不是,那麼與我們分享這個測試的結果,這樣我們可以更好地瞭解您的問題,並給您一個更好的答案,以幫助您解決您的問題。

這假定您正在製作Windows窗體應用程序或WPF應用程序。

var dialog = openFileDialog1; 
if (dialog == null) 
{ 
    MessageBox.Show("openFileDialog1 is null"); 
} 
var filename = dialog.FileName; 
if (filename == null) 
{ 
    MessageBox.Show("openFileDialog1.FileName is null"); 
} 
InstrumentDescription input; 
try 
{ 
    input = InstrumentDescription.Load(filename); 
} 
catch (NullReferenceException e) 
{ 
    MessageBox.Show("NullReferenceException in InstrumentDescription.Load():\n" + e.Message); 
} 
if (input == null) 
{ 
    MessageBox.Show("inputFile is null"); 
} 
var id = input.Identification; 
if (id == null) 
{ 
    MessageBox.Show("inputFile.Identification is null"); 
} 
var mans = id.Manufacturers; 
if (mans == null) 
{ 
    MessageBox.Show("inputFile.Identification.Manufacturers is null"); 
} 
var man = mans.Manufacturer; 
if (man == null) 
{ 
    MessageBox.Show("inputFile.Identification.Manufacturers.Manufacturer is null"); 
} 
var i = 0L; 
foreach (var dm in man) 
{ 
    if (dm == null) 
    { 
     MessageBox.Show("dataManufaturer at index "+i+" is null"); 
    } 

    if (dm.name == null) 
    { 
     MessageBox.Show("dataManufaturer.name at index " + i + " is null"); 
    } 
    if (dm.cageCode == null) 
    { 
     MessageBox.Show("dataManufaturer.cageCode at index " + i + " is null"); 
    } 
    if (dm.FaxNumber == null) 
    { 
     MessageBox.Show("dataManufaturer.FaxNumber at index " + i + " is null"); 
    } 
    var u = dm.URL; 
    if (u == null) 
    { 
     MessageBox.Show("dataManufaturer.URL at index " + i + " is null"); 
    } 
    if (u.OriginalString == null) 
    { 
     MessageBox.Show("dataManufaturer.URL.OriginalString at index " + i + " is null"); 
    } 
    i++; 
} 
+0

我知道,問題在哪裏 - 我知道如何調試並看到所有的變量和一切一步一步,所以我的事情,即添加messagebox是不是很舒適,也正如我在評論中寫道,我終於解決它,非常簡單,但謝謝:) – 2011-05-29 09:53:41