有效地将数组中的空字符串替换为null
本文关键字:字符串 替换 null 数组 有效地 | 更新日期: 2024-10-23 00:33:24
我想知道用null值替换数组中空字符串的最有效方法。
我有以下数组:
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查询或更高效的查询?
您可以考虑将_array[i].Trim() == ""
与string.IsNullOrWhitespace(_array[i])
切换以避免新的字符串分配。但这几乎就是你所能做的,让它更快,并且仍然保持顺序。LINQ不会比for
循环快。
您可以尝试并行处理,但这似乎是一个更大的变化,所以您应该评估在您的场景中是否可以。
Parallel.For(0, _array.Length, i => {
if (string.IsNullOrWhitespace(_array[i]))
{
_array[i] = null;
}
});
就效率而言,这是可以的,但也取决于数组的大小以及在这些数组上迭代的频率。我看到的主要问题是,使用trim
方法可以获得NullReferenceException
。更好的方法是使用string.IsNullOrEmpty
或string.IsNullOrWhiteSpace
,后者更符合您的需求,但并非在所有版本的.net.中都可用
for (int i = 0; i < _array.Length; i++)
{
if (string.IsNullOrWhiteSpace(_array[i]))
{
_array[i] = null;
}
}
LINQ
主要用于查询,而不是分配。若要对"集合"执行某些操作,可以尝试使用List
。如果你用List
而不是Array
,你可以用一行来代替:
_list.ForEach(x => string.IsNullOrWhiteSpace(x) ? x = null; x = x);
linq查询在后台基本上也会做同样的事情,所以简单地使用linq不会获得任何真正的效率。
当确定更有效的东西时,看几件事:
- 你的阵列会增长到多大
- 数组中的数据多久更改一次
- 你数组的顺序重要吗
您已经回答说,您的阵列可能会变大,性能是一个问题。
因此,将选项2和3放在一起看,如果数据的顺序无关紧要,那么可以保持数组的排序,并在检测到非空字符串后中断循环。
理想情况下,您可以在进入的过程中检查数据,这样就不必在整个阵列上不断循环。这不可能吗?
希望这至少能引起一些思考。
这很难看,但正如我前面提到的,您可以使用以下代码消除RTL的CALL指令:
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;
}
}
但它确实增加了一个额外的任务,并包含了一个附加条件,这对我来说太难看了。但如果你想从一个庞大的列表中删除纳秒,那么也许可以使用它。我喜欢并行处理的想法,你可以用并行来包装它。
使用以下代码
_array = _array.Select(str => { if (str.Length == 0) str = null; return str; }).ToArray();