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循环要慢。