Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有效地将数组中的空字符串替换为null_C#_Arrays_Linq - Fatal编程技术网

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

C# 有效地将数组中的空字符串替换为null,c#,arrays,linq,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"; 我目前正在用以下内容替换空字符

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

我有以下数组:

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;
    }
}
for(int i=0;i<\u array.Length;i++)
{
if(_数组[i].Trim()==“”)
{
_数组[i]=null;
}
}
这在小型阵列上运行良好,但我正在寻找一些最有效的代码来完成任务,因为我正在使用的阵列可能会更大,我会反复重复这个过程


是否存在LINQ查询或更有效率的东西?

< P>您可以考虑切换<代码>数组[i]。()(IsNullOrWhitespace)= /代码>使用<代码> String。但这几乎是所有你能做的,使它更快,仍然保持顺序。LINQ不会比循环的

您可以尝试使您的处理并行,但这似乎是一个更大的变化,所以您应该评估在您的场景中这是否合适

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;
    }
}
for(int i=0;i<\u array.Length;i++)
{
if(string.IsNullOrWhiteSpace(_数组[i]))
{
_数组[i]=null;
}
}

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

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

linq查询在幕后基本上也会做同样的事情,所以仅仅使用linq不会获得任何真正的效率

在确定更有效的方法时,请注意以下几点:

  • 您的阵列将增长多大
  • 阵列中的数据多久更改一次
  • 数组的顺序重要吗
  • 您已经回答过阵列可能会变大,性能是一个问题

    因此,将选项2和选项3放在一起看,如果数据的顺序无关紧要,那么可以对数组进行排序,并在检测到非空字符串后中断循环

    理想情况下,您可以在输入数据的过程中检查数据,这样就不必不断地在整个阵列上循环。这不可能吗

    希望这至少能引起一些思考。

    使用下面的代码

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

    这很难看,但是您可以使用以下代码消除对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;
      }
    }
    
    if(_数组[i]!=null){
    布尔空白=真;
    对于(int j=0;j

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

    你将不再需要
    .Trim()
    @JanR-谢谢,我在我的改动中没有领会到这一点,这就是我回答的全部要点:)我无法想象你能比这快得多,除非你求助于本机代码并进行汇编!或者您自己在循环中实现IsNullOrWhiteSpace来保存调用指令。IsNulOrWhitespace的代码在这里@PaulBartlett-唯一可以做的就是像MarcinJuraszek建议的那样使用TPL库。除此之外,我同意,这可能是最好的。您也可以在上面的代码段中使用string.IsNullOrWhitespace(str)而不是str.length==0。它的代码更少,但实际上比数组+for循环要慢。