有效地将数组中的空字符串替换为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查询或更高效的查询?

有效地将数组中的空字符串替换为null

您可以考虑将_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.IsNullOrEmptystring.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不会获得任何真正的效率。

当确定更有效的东西时,看几件事:

  1. 你的阵列会增长到多大
  2. 数组中的数据多久更改一次
  3. 你数组的顺序重要吗

您已经回答说,您的阵列可能会变大,性能是一个问题。

因此,将选项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();