2012-03-16 49 views
0

我需要例如列表項的數量,不是「」。 ATM,我解決這個問題是這樣的:如何獲得符合特定條件的列表項數目?

public int getRealCount() 
    { 
     List<string> all = new List<string>(originList); 
     int maxall = all.Count; 
     try 
     { 
      for (int i = 0; i < maxall; i++) 
      { 
       all.Remove(""); 
      } 
     } 
     catch { } 
     return all.Count; 
    } 

毫無疑問,性能是相當糟糕的。我很幸運,它只是一個10項列表,但在手機上,你應該避免這樣的代碼。

所以我的問題是,我該如何改進這個代碼?

一個想法是:可能已經有一個方法。第二種方法是:所有可能只填充不是「」的項目。

我應該如何解決這個問題?

感謝

+0

也許列表的函數findAll是最好的?嘗試它的表現 – gaussblurinc 2012-03-16 21:00:06

回答

5

聽起來像是你想:

return originList.Count(x => x != ""); 

沒有必要在所有創建集合的副本。請注意,在源代碼開始時,您需要在使用指令中使用using System.Linq;

(請注意,您應該有空的catch塊這樣的 - 這是一個可怕想法來抑制這樣的例外只有捕獲異常時,你要麼要真正處理他們或當你想重新拋出它們包裝成另一種類型。如果你必須忽略一個例外,你至少應該記錄它的地方。)

+0

哇,不要以爲它會那麼容易。非常感謝! – roqstr 2012-03-16 21:08:30

1

你在列表中調用all.remove(「」),對每一個項目的所有。爲什麼不只是調用一次?你沒有使用我都在你的代碼...

爲什麼不:

public int getRealCount() 
    { 
     List<string> all = new List<string>(originList); 

     int erased =all.RemoveAll(delegate(string s) 
     { 
      return s == ""; 
     }); 

     return all.Count - erased; 
    } 

更新:

固定我的問題。這是沒有lambda的。

+0

如果存在多個空字符串,則不起作用。 – 2012-03-16 21:01:17

1

您應該使用LINQ。安裝ReSharper,它會爲你生成它。

另外,不要創建一個int maxall = all.Count,然後在for循環中使用它。

對於移動應用程序,您不應該使用不必要的內存,因此只需在for循環中使用all.Count即可。

2

如果性能是您的問題,那麼您應該保留一個僅用於這些項目的集合。

如果性能不是什麼大問題,我建議你在你的集合上使用Linq查詢。關於Linq的很酷的事情是,搜索延遲到你需要它爲止。

int nonEmptyItemCount = originList.Count(str => !string.IsNullOrEmpty(str)); 

你也可以做

int nonEmptyItemCount = originList.Count(str => str != ""); 
+0

Count返回一個int,而不是'IEnumerable '。 – 2012-03-16 21:31:45

+0

D'oh!修好了,謝謝指出! – 2012-03-17 23:06:56

相關問題