2016-05-17 17 views
-1
if (text != "" || text != null) 
        myList[i] = text; 

myList是字符串數組 但是,在循環結束時,我一直在myList中看到「」或null的項目。爲什麼我在數組中看到空或「」項?

WindowSnap[] windowsarray = WindowSnap.GetAllWindows(true, true).ToArray(); 
      this.listBoxSnap.BeginUpdate(); 
      this.listBoxSnap.Items.Clear();   
      this.listBoxSnap.Items.AddRange(windowsarray); 
      string[] myList = new string[listBoxSnap.Items.Count]; 
      for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--) 
      { 
       string tt = listBoxSnap.Items[i].ToString(); 

       int first = tt.IndexOf("Text: "); 
       int second = tt.IndexOf(",", first + 6); 
       string text = tt.Substring(first + 6, second - first - 6); 
       if (text != "" || text != null) 
        myList[i] = text; 
      } 

我試過循環內循環和後線:

myList.Where(x => !string.IsNullOrEmpty(x)).ToArray(); 

但還是有與項目 「」

+4

如果您不想將空字符串或null放入數組中,請使用&&,而不是||。更好的是,使用!string.IsNullOrEmpty(value)。 –

+0

反轉它並使用'.Equals()'方法也會更好。 'if(!text.Equals(null)&&!text.Equals(string.empty))' – Draken

+0

@Draken爲什麼Equals會更好?兩者最終都做了完全相同的事情。 – juharr

回答

4

而不是做

if(text != "" || text != null) 

if(!String.IsNullOrEmpty(text)) 

您的病情中的OR是錯誤的。它應該是AND。

另請注意,如果您使用List<string>而不是String[]會更好。數組的大小是固定的,所以對於上述條件跳過的項目,您仍然會在輸出中獲得空值。另一方面,列表可以在需要時一個一個種植。所以,你的代碼看起來像:

WindowSnap[] windowsarray = WindowSnap.GetAllWindows(true, true).ToArray(); 
this.listBoxSnap.BeginUpdate(); 
this.listBoxSnap.Items.Clear();   
this.listBoxSnap.Items.AddRange(windowsarray); 

List<string> myList = new List<string>(); 
for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--) 
{ 
    string tt = listBoxSnap.Items[i].ToString(); 
    int first = tt.IndexOf("Text: "); 
    int second = tt.IndexOf(",", first + 6); 
    string text = tt.Substring(first + 6, second - first - 6); 
    if (!String.IsNullOrEmpty(text)) 
     myList.Add(text); 
} 

如果你是LINQ的球迷,你可以做這樣的:

string[] mylist = (from tt in listBoxSnap.Items.Cast<object>().Select(x => x.ToString()) 
      let first = tt.IndexOf("Text: ") 
      let second = tt.IndexOf(",", first + 6) 
      let text = tt.Substring(first + 6, second - first - 6) 
      where !String.IsNullOrEmpty(text) 
      select text).Reverse().ToArray(); 

請注意,我Cast荷蘭國際集團Items集合object。如果您知道listBoxSnap中項目的實際類型,則可能需要將其轉換爲該類型。

+0

他不想從原始東西中刪除東西數組按照OP。 – dotNET

+0

你是指輸出數組,而不是原始數組。我已經更新了我的答案。 – dotNET

+0

我忘了提及,在創建/創建myList數組後,我不想將這個數組作爲項目添加到列表框中,我想更改已經在列表框文本中的現有項目。也許我現在應該使用myList數組變量,直接使用windowsarray或直接使用已添加的listBox項目。我想要的是刪除每個項目的一些文字。我做了索引和子字符串,但我如何更新列表框中的項目文本? –

2

首先這行:

string[] myList = new string[listBoxSnap.Items.Count]; 

創建了多個元素的字符串數組作爲listBoxSnap.Items。所有這些元素都被初始化爲null。所以null元素從那裏開始

其次,在你的循環中你設置了元素if (text != "" || text != null)。對於所有text s,這是true,因爲||表示。因此,它是空的(所以它不是"")或它不是空(所以它也是如此)。

所以你最好使這個陣列中的List

List<string> myList = new List<string>(); 

,並在你的循環,你做的事:

if (!string.IsNullOrEmpty(text)) myList.Add(text); 
0
if (text != "" || text != null) 
    myList[i] = text; 

這讓我想起了一個道德故事有關編程,我在聽到我的大學時代。這個故事(應該是真的)是因爲一個年輕的程序員正在制定一項對18歲以上和65歲以上人羣實行豁免的規則。因此,要實現這個規則,程序員寫了這樣的代碼:

if (age < 18 and age > 65) 
    exempt = true; 

不用說,他的同事最終發現該漏洞在他的代碼,並試圖解釋給他,但他堅持認爲,他是實施規則正如,因爲它是在要求中說明:豁免是針對18歲以下客戶的18,以上的客戶。他不明白他爲什麼需要在條件測試中使用

道德

對於(在希望少數),你們誰看不出是什麼問題,這個測試應該是這樣的:

if (text != "" && text != null) 
    myList[i] = text; 

如果您還沒有看到它,問自己textnull會發生什麼情況。

相關問題