Код: Выделить всё
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;
}
На данный момент я только что подавил это предупреждение.< /p>
Мой вопрос: есть ли хороший способ переписать это так, чтобы это было так же читабельно?
Resharper предлагает следующее:
Код: Выделить всё
foreach (var item in data.Where(item => !process(item)))
{
break;
}
Я тоже подумал:
Код: Выделить всё
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
Мобильная версия