2016-04-21 43 views
0

我想知道用空值替換數組中空字符串的最有效方法。用空數組替換空字符串有效

我有以下陣列:

string[] _array = new string [10]; 
_array[0] = "A"; 
_array[1] = "B"; 
_array[2] = ""; 
_array[3] = "D"; 
_array[4] = "E"; 
_array[5] = "F"; 
_array[6] = "G"; 
_array[7] = ""; 
_array[8] = ""; 
_array[9] = "J"; 

和我目前通過更換空字符串如下:

for (int i = 0; i < _array.Length; i++) 
{ 
    if (_array[i].Trim() == "") 
    { 
     _array[i] = null; 
    } 
} 

工作正常的小數組,但我追逐一些代碼,在做任務時效率最高,因爲我正在使用的數組可能更大,我會一遍又一遍地重複這個過程。

有沒有linq查詢或更有效的東西?

回答

6

您可能會考慮將​​3210與string.IsNullOrWhitespace(_array[i])切換以避免新的字符串分配。但是,幾乎所有可以做到的事情都是爲了讓它更快速,並且仍然保持順序。 LINQ不會比for循環更快。

你可以嘗試讓你的處理並行,但這看起來像一個更大的變化,所以你應該評估,如果在你的情況下沒問題。

Parallel.For(0, _array.Length, i => { 
    if (string.IsNullOrWhitespace(_array[i])) 
    { 
     _array[i] = null; 
    } 
}); 
3

就效率而言,它是好的,但它也取決於數組的大小以及您將在這些數組上迭代的頻率。我看到的主要問題是,您可以使用trim方法獲得NullReferenceException。更好的方法是使用string.IsNullOrEmptystring.IsNullOrWhiteSpace,後者更符合你想要的,但不適用於所有版本的.net。

for (int i = 0; i < _array.Length; i++) 
{ 
    if (string.IsNullOrWhiteSpace(_array[i])) 
    { 
     _array[i] = null; 
    } 
} 
+2

你將不再需要'.Trim()' – JanR

+0

@JanR - 謝謝,我沒有在我的改動中得到這個,這是我的答案的全部重點:) – Igor

+0

我無法想象你可以得到比這除非你訴諸本地代碼,並進行組裝!或者您自己在循環中實現IsNullOrWhiteSpace以保存Call指令。 IsNulOrWhitespace的代碼在這裏http://referencesource.microsoft.com/#mscorlib/system/string.cs,55e241b6143365ef –

2

LINQ主要用於查詢不是分配。要對Collection執行某些操作,您可以嘗試使用List。如果您使用的List而不是Array,你可以用一條線,而不是做:

_list.ForEach(x => string.IsNullOrWhiteSpace(x) ? x = null; x = x); 
+0

它的代碼少,但實際上比數組+ for循環慢。 – MarcinJuraszek

0

LINQ查詢將主要做幕後同樣的事情,所以你不打算使用簡單地獲得任何真正的效率LINQ。

在確定的東西更高效,看看幾件事情:

  1. 多大將你的數組增長?
  2. 數組中的數據多久更改一次?
  3. 數組的順序是否重要?

你已經回答說你的數組可能會增長到很大的尺寸,並且性能是一個問題。

因此,一起看看選項2和3,如果數據的順序並不重要,那麼在檢測到非空字符串之後,您可以保留數組的排序並打破循環。

理想情況下,您將能夠檢查路上的數據,因此您不必經常循環遍歷整個陣列。這不可能嗎?

希望這至少得到一些想法。

-1

使用以下代碼

_array = _array.Select(STR => {如果(str.Length == 0)STR = NULL;返回STR;})ToArray的();

+0

你也可以在上面的代碼片段中使用string.IsNullOrWhitespace(str)而不是str.length == 0 – Maddy

0

這是醜陋的,但可以消除CALL指令的RTL,正如我前面提到的,使用此代碼:

if (_array[i] != null) { 
    Boolean blank = true; 
    for(int j = 0; j < value.Length; j++) { 
    if(!Char.IsWhiteSpace(_array[i][j])) { 
     blank = false; 
     break; 
    } 
    } 

    if (blank) { 
    _array[i] = null; 
    } 
} 

但它確實增加了一個額外的任務,包括一個額外的條件,它只是對我來說太醜陋了。但是如果你想從一個巨大的清單中刪除納秒,那麼也許可以使用它。我喜歡並行處理的想法,你可以用Parallel來包裝它。