2010-10-10 41 views
4

我想知道如果一个方法来确定某个范围的数组元素是否为空。例如,如果数组被初始化为具有值“”的10个元素,则如果数据稍后被分配给元素5,7,9;我可以测试元素0-3是否为空,或者是否包含空字符串“”?C#:有没有办法确定一系列元素是否为空?

+0

难道你不能简单地用10个空值而不是10个空字符串来启动数组吗? (“”!= null) – 2010-10-10 22:45:31

+0

我的第一个破解就是像if(Array.IndexOf(array,“”)<4),它看到前四个元素是否有空白条目。似乎有点笨重,但。 – Sinaesthetic 2010-10-10 22:45:39

回答

5
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)); 

因此改变AllAny

+0

只检查元素0-2。 – Guffa 2010-10-10 22:53:48

+0

好吧,我认为这是有道理的。但是,这不仅仅是检查整个范围是空白的吗?我想我应该更具体。基本上我想要做的是确定该范围内的任何元素是否包含空白 – Sinaesthetic 2010-10-10 23:03:11

+0

@Sinaesthetic,修改后的答案,但使用“Any”运算符而不是“All”。 – 2010-10-10 23:10:59

3
bool is0to3empty = myArrayOfString.Skip(0).Take(4).All(i => string.IsNullOrEmpty(i)); 
+3

不应该拿(4)? – 2010-10-10 22:50:50

+0

@Jonathan是的,但我不认为确切的数字是真正的问题在这里。 – 2010-10-11 04:26:55

+0

我担心有人会看到Take(3),并且认为它的意思是“将所有元素索引到3”。 – 2010-10-12 18:28:36

1

创建此扩展类,你可以从任何字符串数组称之为:

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; 
     } 

    } 
2

的最直接,最有效的是简单地通过数组的那部分循环:

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);