Как обнаружить один список массива, включающий некоторый элемент в C # - PullRequest
2 голосов
/ 01 июля 2010

Предположим, я объявил массив isFind[], как это,

bool[] isFind = new bool[5];

for (int i = 0; i < 5; ++i)
{
   isFind[i] = init(); // initialize isFind[]
}

bool init();
{
  ...; // some code here
}

Есть ли какой-нибудь быстрый метод (с меньшим набором кода), чтобы обнаружить, есть элемент false или нет в isFind[]? Я не хочу for/foreach Loop каждый элемент в списке массивов.

[Обновить]

.NET 2.0 Используется.

быстрый метод (меньше набираемого кода)

Ответы [ 6 ]

6 голосов
/ 01 июля 2010

Если вы используете .NET2, вы можете использовать статический метод TrueForAll:

bool allTrue = Array.TrueForAll(isFind, delegate(bool b) { return b; });
2 голосов
/ 01 июля 2010

Единственный способ найти что-то - это поискать.Предполагая, что ваш массив не отсортирован (в противном случае вам нужно будет только посмотреть на первый или последний элемент, в зависимости от сортировки), и у вас нет внешнего кэша, вы должны проверить все его элементы, поэтому вам нужнопетля.Неважно, если вы напишите это явно или через другую функцию, цикл будет каким-то образом.

2 голосов
/ 01 июля 2010

.NET 2.0 версия:

bool []isFind = new bool[3];

isFind[0] = true;
isFind[1] = true;
isFind[1] = false;

bool exists = (Array.IndexOf(isFind, false) != -1);

Код использует внутренний цикл for.Также у вас было неправильное объявление массива.

2 голосов
/ 01 июля 2010

Если у вас есть .NET 3.5 или выше, вы можете использовать Enumerable.Any:

isFind.Any(x => !x)

Из вашего обновления к вопросу, который вы используете .NET 2.0, поэтому, вероятно, лучшим вариантом будет написание цикла.

1 голос
/ 01 июля 2010

Я думаю, вы можете записать, был ли какой-либо элемент false на этапе инициализации:

bool isFind[] = new isFind[5];
bool containsFalse = false;

for (int i = 0; i < isFind.Length; i++)
{
   if (!(isFind[i] = init())) // initialize isFind[]                                 
      containsFalse = true; // and record if item was false
}
1 голос
/ 01 июля 2010

Этот код не использует отдельный цикл для поиска ложных элементов.(В общем случае нет способа выполнить сравнение n объектов без циклического повторения всех из них хотя бы один раз.) Для массива из пяти элементов стоимость цикла незначительна.Если вы используете массивы большего размера, посмотрите на BitArray для получения информации о производительности / пространстве.

bool isFind[] = new isFind[5];
bool falseExists = false;

for (int i = 0; i < 5; ++i)
{
   isFind[i] = init(); // initialize isFind[]
   if(!isFind[i])
       falseExists=true;
}

bool init();
{
  ...; // some code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...