Как определить количество непустых строк в массиве строк

#c# #arrays #string

#c# #массивы #строка

Вопрос:

У меня есть строка, разделенная каналами:

 string line = "test|||tester||test||||||test test|"
 

Я читаю это введение в массив строк:

 string[] wordsArr = line.Split(new string[] { "|" }, StringSplitOptions.None);
 

Моя цель — не писать цикл вручную самостоятельно, если в фреймворк встроен способ увидеть, сколько элементов в массиве не пусто. Также я не могу использовать RemoveEmptyEntries свойство в StringSplitOptions b / c, где элементы попадают в трубы.

Есть идеи?

Комментарии:

1. Почему вы хотите сделать это без цикла? Что-то будет где -то зацикливаться в любом разумном решении…

2. Мне было просто любопытно, что в любом случае возможно встроить в фреймворк без необходимости вручную выполнять проверку в цикле.

3. Существует большая разница между тем, чтобы не писать цикл самостоятельно, и тем, чтобы вообще не было цикла. ответ gunr2171 — это то, на что я бы пошел, но он использует цикл внутри Count .

4. Правильно… Я отредактировал начальный пост, чтобы отразить это. Спасибо

Ответ №1:

Если все, что вы ищете, это количество, то используйте .Count после разделения.

 string line = "test|||tester||test||||||test test|";

int notEmptyCount = line
    .Split('|')
    .Count(x => !string.IsNullOrEmpty(x));
 

Если вы хотите отфильтровать пустые элементы и получить доступ ко всем оставшимся элементам, используйте .Where вместо этого.

 var notEmptyCollection = line
    .Split('|')
    .Where(x => !string.IsNullOrEmpty(x));
 

Комментарии:

1. Внутренне это также будет перебирать массив. Но, как сказал Джон Скит: любое разумное решение будет зацикливаться … 🙂

2. @Abbas, моей первоначальной мыслью было «нет цикла ‘do’ или ‘for / foreach'». Но да, иногда ответ, который мы получаем, — это не тот ответ, который мы хотим.

Ответ №2:

Попробуйте это:

 string line = "test|||tester||test||||||test test|";
string[] wordsArr = line.Split(new string[] { "|" }, StringSplitOptions.None);
var notEmpty = wordsArr.Count(x => !String.IsNullOrEmpty(x));
 

Ответ №3:

Это сработало:

 int wordCount = line.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).Length;
string[] wordsArr = line.Split(new string[] { "|" }, StringSplitOptions.None);
 

Ответ №4:

найдите самый простой способ, как показано ниже

 string line = "test|||tester||test||||||test test|";
int notEmptyCount = line.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).Length;
 

В этом StringSplitOptions.RemoveEmptyEntries параметре флага пустые значения при разделении опускаются.

для получения дополнительной справки проверьте здесь (MSDN)

Комментарии:

1. По сути, это тот же ответ, что и ответ, который дал сам Аль Бельмондо.