Я кое-что изучил и не могу найти хороший способ сделать это.У меня есть функциональный код, но я хочу очистить его, не используя ручной подсчет или разрывы.Я посмотрел на функцию LINQs TakeWhile, но в данном случае этого недостаточно.Вот пример работающей реализации функционального эквивалента:
bool foo(List<strings> stringList, int counter)//assume this list has, like, 10 elements, and counter=3, idk
{
...
bool found= false;
for(int i=0; i<stringList.Count && !found; i++)
{
if(stringlist[i].length < 2 || counter >=6)
found=true;
counter++;
}
...
return found
}
И я хочу заменить его на некоторую «волшебную» функцию, подобную этой:
bool foo(List<strings> stringList, int counter)//assume this list has, like, 10 elements, and counter=3, idk
{
...
bool found= false;
foreachwhile(string s in stringList while !found)
{
if(s.length < 2 || counter >=6)
found=true;
counter++;
}
...
return found
}
Есть ли какая-то функциякоторый может сделать это уже, и если нет, как я могу написать один на C # ... или приблизиться?Я часто нахожу, что мне нужно это сделать, и да, я знаю, что:
bool foo(List<strings> stringList, int counter)//assume this list has, like, 10 elements, and counter=3, idk
{
...
bool found= false;
foreach(string s in stringList)
{
if(found)
break;
if(s.length < 2 || counter >=6)
found=true;
counter++;
}
...
return found
}
технически тоже работает, но я бы хотел избежать разрывов в моем коде.Есть ли другой чистый способ сделать это в c #?
РЕДАКТИРОВАТЬ: Я вижу много путаницы в отношении того, что я здесь спрашиваю.Я бы предпочел способ добавить очень четкую проверку, если мы должны прервать работу самого оператора foreach, если это возможно, или способ написать мою собственную версию foreach
, которая принимает параметр, который продолжается только тогда, когда условие истинно, напримерпуть еще не найден.
Кроме того, я прошу прощения за непонятность, но самая большая причина, по которой я хочу избежать разрыва, состоит в том, что я не выпрыгиваю из цикла в произвольной точке.В этом отношении возврат так же нежелателен.
Я тоже ничего не имею против Linq, я пытался его использовать, но я обнаружил, что он не обеспечивает нужную мне функциональность:
bool foo(List<strings> stringList, int counter)//assume this list has, like, 10 elements, and counter=3, idk
{
bool found= false;
foreach(string s in stringlist.Takewhile(x=> (!found)))
{
if(s.length < 2 || counter >=6)
found=true;
counter++;
}
return found
}
отличается от описанной выше логики, посколькуTakeWhile
выполняется первым и возвращает пустой набор, в результате чего в цикле foreach
больше нечего зацикливаться.Если у кого-то есть другой способ написать это, я искренне хотел бы услышать это, поскольку синтаксически это выглядит чрезвычайно чистым.