Нет такого метода расширения, как у вас.Позвольте мне объяснить, почему я думаю, что это (за исключением очевидной причины «потому что она не была указана, реализована, проверена, задокументирована и т. Д.»).
По сути, эта реализация обязательно неэффективна.Создание массива из параметров, переданных в In
(как это происходит при использовании ключевого слова params
), является операцией O (N) и вызывает необоснованное давление ГХ (из-за создания нового объекта T[]
).Contains
затем перечисляет по этому массиву, что означает, что ваш исходный код был более чем удвоен во время выполнения (вместо одного частичного перечисления с помощью закороченной оценки у вас есть одно полное перечисление, за которым следует частичное перечисление).
Давление ГХ, вызванное построением массива , можно несколько ослабить , заменив версию params
метода расширения на X перегрузок, принимающих от 1 до X параметров типа T
, где X - этокакое-то разумное число ... как 1-2 дюжины.Но это не меняет того факта, что вы передаете значения X на новый уровень стека вызовов, чтобы проверить потенциально меньше, чем X из них (т. Е. Это не устраняет снижение производительности, а только уменьшает его).
И еще одна проблема: если вы намерены использовать этот метод расширения In
в качестве замены для цепочки ||
сравнений, есть еще кое-что, что вы могли бы упустить из виду.С ||
вы получаете короткозамкнутую оценку;то же самое не относится к параметрам, передаваемым в методы.В случае перечисления, как в вашем примере, это не имеет значения.Но рассмотрим этот код:
if (0 == array.Length || 0 == array[0].Length || 0 == array[0][0].Length)
{
// One of the arrays is empty.
}
Приведенный выше (странный / плохой - только для иллюстрации) код не должен выдавать IndexOutOfRangeException
(он может выдать NullReferenceException
, но это не имеет отношения к тому, что яделаю)Однако «эквивалентный» код, использующий In
, вполне может:
if (0.In(array.Length, array[0].Length, array[0][0].Length)
{
// This code will only be reached if array[0][0].Length == 0;
// otherwise an exception will be thrown.
}
Я не говорю, что ваша идея расширения In
плохая.В большинстве случаев, при правильном использовании, это может сэкономить при наборе текста, а затраты на производительность и память не будут заметны.Я просто предлагаю свои мысли о том, почему метод такого рода не подходит в качестве встроенного библиотечного метода: потому что его затраты и ограничения могут быть неправильно поняты, что приведет к чрезмерному использованию и неоптимальному коду.