Вы действительно намереваетесь сделать Содержит и гарантировать, что вы будете применять Содержит на все возможные объекты , где вы можете использовать этот метод расширения?
Если некоторые данные объекты проверяют равенство с помощью перегрузки оператора ==, тогда ваше общее решение не будет выполнено. Это делает его не истинным эквивалентом множества тестов ==. Это также хороший пример опасности написания методов расширения!
Следующий код Linq работает, когда вы реализуете перегрузку операторов, а также если вы используете значение сравнения по умолчанию == для сравнения ссылок на объекты, чтобы сказать, что значение на самом деле является тем же объектом, что и значение1, 2, 3 или 4, учитывая как тип объекта ваших значений в данном конкретном случае:
V[] lv = { value, value2, value3, value4 };
if (lv.Any( v => v==value))
// do something
Или сокращенная версия:
if (new List<V>{value, value2, value3, value4 }.Any( v => v==value))
// do something
Мне не удалось заставить вышеприведенные лямбда-выражения работать в общем методе расширения.
В качестве хорошего (если не относящегося к делу) примера того, что я считаю прекрасным читабельным синтаксисом, идиома в Python будет выглядеть следующим образом:
if value in (value1, value2, value3, value4):