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

时间:2016-04-21 01:56:00

标签: c# arrays linq

我想知道用空值替换数组中空字符串的最有效方法。

我有以下数组:

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 个答案:

答案 0 :(得分:6)

您可以考虑使用_array[i].Trim() == ""切换string.IsNullOrWhitespace(_array[i])以避免新的字符串分配。但是,你可以做的就是让它更快,并保持顺序。 LINQ不会比for循环快。

你可以试着让你的处理并行,但这似乎是一个更大的改变,所以你应该评估你的情况下是否可以。

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

答案 1 :(得分:3)

就效率而言它很好但它还取决于数组的大小以及迭代这些数组的频率。我看到的主要问题是您可以使用NullReferenceException方法获得trim。更好的方法是使用string.IsNullOrEmptystring.IsNullOrWhiteSpace,后者更符合您的要求,但并非在所有.net版本中都可用。

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

答案 2 :(得分:2)

LINQ主要用于查询而非分配。要对Collection执行某些操作,您可以尝试使用List。如果您使用List代替Array,则可以使用一行代替:

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

答案 3 :(得分:0)

linq查询将在幕后完成同样的事情,因此您只需使用linq即可获得任何真正的效率。

在确定更有效的方法时,请看一些事情:

  1. 你的阵列会增长多少?
  2. 阵列中的数据多久会发生变化?
  3. 您的阵列的顺序是否重要?
  4. 您已经回答过您的阵列可能会变得很大并且性能也很重要。

    所以一起查看选项2和3,如果数据的顺序不重要那么你可以保持数组排序并在检测到非空字符串后中断循环。

    理想情况下,您可以检查路上的数据,这样您就不必经常遍历整个阵列。这不可能吗?

    希望这至少会有一些想法。

答案 4 :(得分:0)

这很难看,但正如我前面提到的那样,您可以使用以下代码消除对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;
  }
}

但它确实增加了一项额外的任务并包含一个额外的条件,这对我来说太难看了。但是如果你想从一个庞大的列表中减去纳秒,那么也许可以使用它。我喜欢并行处理的想法,你可以用Parallel包装它。

答案 5 :(得分:-1)

使用以下代码

_array = _array.Select(str => { if (str.Length == 0) str = null; return str; }).ToArray();