我想知道如果一个方法来确定某个范围的数组元素是否为空。例如,如果数组被初始化为具有值“”的10个元素,则如果数据稍后被分配给元素5,7,9;我可以测试元素0-3是否为空,或者是否包含空字符串“”?C#:有没有办法确定一系列元素是否为空?
回答
array.Skip(startIndex).Take(count).All(x => string.IsNullOrEmpty(x));
所以,如果你想查询元素0-3:
array.Skip(0).Take(4).All(x => string.IsNullOrEmpty(x));
为清楚起见,我在那里留下Skip
。
编辑:使其Take(4)
,而不是3按在对方的回答乔纳森的评论(现在在我Guffa的评论;))。
编辑2:根据下面的注释,在OP想看看这些单元的任意匹配:
array.Skip(0).Take(4).Any(x => string.IsNullOrEmpty(x));
因此改变All
到Any
。
只检查元素0-2。 – Guffa 2010-10-10 22:53:48
好吧,我认为这是有道理的。但是,这不仅仅是检查整个范围是空白的吗?我想我应该更具体。基本上我想要做的是确定该范围内的任何元素是否包含空白 – Sinaesthetic 2010-10-10 23:03:11
@Sinaesthetic,修改后的答案,但使用“Any”运算符而不是“All”。 – 2010-10-10 23:10:59
bool is0to3empty = myArrayOfString.Skip(0).Take(4).All(i => string.IsNullOrEmpty(i));
不应该拿(4)? – 2010-10-10 22:50:50
@Jonathan是的,但我不认为确切的数字是真正的问题在这里。 – 2010-10-11 04:26:55
我担心有人会看到Take(3),并且认为它的意思是“将所有元素索引到3”。 – 2010-10-12 18:28:36
创建此扩展类,你可以从任何字符串数组称之为:
public static class IsEmptyInRangeExtension
{
public static bool IsEmptyInRange(this IEnumerable<string> strings, int startIndex, int endIndex)
{
return strings.Skip(startIndex).TakeWhile((x, index) => string.IsNullOrEmpty(x) && index <= endIndex).Count() > 0;
}
}
的最直接,最有效的是简单地通过数组的那部分循环:
bool empty = true;..
for (int i = 0; i <= 3; i++) {
if (!String.IsNullOrEmpty(theArray[i])) {
empty = false;
break;
}
}
if (empty) {
// items 0..3 are empty
}
另一种替代方法是使用扩展方法进行循环:
bool empty = theArray.Take(4).All(String.IsNullOrEmpty);
难道你不能简单地用10个空值而不是10个空字符串来启动数组吗? (“”!= null) – 2010-10-10 22:45:31
我的第一个破解就是像if(Array.IndexOf(array,“”)<4),它看到前四个元素是否有空白条目。似乎有点笨重,但。 – Sinaesthetic 2010-10-10 22:45:39