Как устранить предупреждение SonarQube S3267: «Циклы следует упростить с помощью выражений «LINQ»»C#

Место общения программистов C#
Ответить
Anonymous
 Как устранить предупреждение SonarQube S3267: «Циклы следует упростить с помощью выражений «LINQ»»

Сообщение Anonymous »

Рассмотрим следующий код (который является упрощенной версией моего настоящего кода):

Код: Выделить всё

static void Main(string[] args)
{
string[] data = { "one", "two", "three", "stop", "four", "five" };

foreach (string item in data) // S3267
{
if (!process(item))
break;
}
}

static bool process(string text)
{
if (text == "stop")
return false;

Console.WriteLine(text);
return true;
}
В указанной строке это вызывает предупреждение SonarQube S3267: «Циклы следует упростить с помощью выражений «LINQ».
На данный момент я только что подавил это предупреждение.< /p>
Мой вопрос: есть ли хороший способ переписать это так, чтобы это было так же читабельно?
Resharper предлагает следующее:

Код: Выделить всё

foreach (var item in data.Where(item => !process(item)))
{
break;
}
но это просто вызывает предупреждение SonarQube: «Циклы, содержащие не более одной итерации, должны быть реорганизованы» (или что-то подобное), и я думаю, что это менее читабельно, чем исходная версия.
Я тоже подумал:

Код: Выделить всё

foreach (var item in data.TakeWhile(process))
{
}
но, на мой взгляд, это затушевывает ситуацию.
Также есть

Код: Выделить всё

_ = data.All(process);
но сейчас мы просто становимся глупыми.
Я также подумываю о добавлении своих собственных методов расширения:

Код: Выделить всё

public static class MyEnumerableExt
{
#pragma warning disable S3267 // Loops should be simplified with "LINQ" expressions

public static void ProcessUntil(this IEnumerable sequence, Func process)
{
foreach (var element in sequence)
{
if (process(element))
break;
}
}

public static void ProcessWhile(this IEnumerable sequence, Func process)
{
foreach (var element in sequence)
{
if (!process(element))
break;
}
}

#pragma warning restore S3267 // Loops should be simplified with "LINQ" expressions
}
Тогда местом вызова будет:

Код: Выделить всё

data.ProcessWhile(process);
но мне не очень нравится добавлять слишком много методов расширения, особенно если они используются только в очень ограниченных ситуациях.
Есть ли что-нибудь лучше способ решить это? (Я понимаю, что многие ответы на этот вопрос будут вопросом мнения, но я ищу конкретное, объективное предложение.)
(Я думаю, что просто скрыть предупреждение - правильный подход , но я открыт для предложений!)

Подробнее здесь: https://stackoverflow.com/questions/722 ... -with-linq
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»