2016-04-21 55 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来包装它。