Мне нравятся эти методы за контакт с перечислениями, которые имеют набор атрибута Флагов:
public static bool AnyOf(this object mask, object flags)
{
return ((int)mask & (int)flags) != 0;
}
public static bool AllOf(this object mask, object flags)
{
return ((int)mask & (int)flags) == (int)flags;
}
public static object SetOn(this object mask, object flags)
{
return (int)mask | (int)flags;
}
etc.
использование В качестве примера:
var options = SomeOptions.OptionA;
options = options.SetOn(OptionB);
options = options.SetOn(OptionC);
if (options.AnyOf(SomeOptions.OptionA | SomeOptions.OptionB))
{
etc.
исходные методы были от этой статьи: http://www.codeproject.com/KB/cs/masksandflags.aspx?display=Print я просто преобразовал их в дополнительные методы.
одна проблема с ними, хотя то, что параметры типа объекта, что означает, что весь объекты заканчивают тем, что были расширены с помощью этих методов, тогда как идеально они должны только относиться к перечислениям.
Обновление Согласно комментариям, можно обойти "загрязнение подписи", за счет производительности, как это:
public static bool AnyOf(this Enum mask, object flags)
{
return (Convert.ToInt642(mask) & (int)flags) != 0;
}
Семь или более цифр, смешанные с любым числом любого другого типа символа? Это не кажется очень полезным требованием, но вот вам:
^\D*(?:\d\D*){7,}$
(?:\d.*){7,}
(?: ...)
- сгруппировать содержащийся шаблон в атомарную единицу \ d
- сопоставить цифру . *
сопоставить 0 или более любого символа {7,}
соответствуют 7 или более из предшествующего шаблона Если единственными разделителями, которые вы хотите игнорировать, являются пробелы, тире, круглые скобки и символ 'X', тогда используйте вместо этого:
(?:\d[- ()X]*){7,}
[...]
создает класс символов, соответствующий любому из содержащихся в нем символов Разница заключается, например, в том, что первое регулярное выражение будет соответствовать «a1b2c3d4e5f6g7h»
, а второй - нет.
Как Грегор указывает в комментариях, выбор регулярного выражения зависит от того, с какой функцией вы его используете. Некоторые функции ожидают, что регулярное выражение будет соответствовать всей строке, и в этом случае вы должны добавить дополнительный . *
впереди, чтобы соответствовать любому заполнению перед 7 цифрами. Некоторые ожидают, что регулярное выражение будет соответствовать только части строки (это то, что я ожидал в своих примерах).
Согласно документации для IsMatch ()
, это только «указывает, является ли регулярное выражение находит совпадение во входной строке, "не требует совпадения со всей строкой, поэтому не следует"
Почему вы хотите использовать для этого регулярные выражения? Первая опубликованная вами функция Validate
, которая просто подсчитывает количество цифр, намного более понятна и, вероятно, быстрее. Я бы просто отказался от ненужного вызова ToCharArray
, свернул предикат в функцию Count
и покончил с этим:
s.Count(char.IsDigit) >= 7;
Обратите внимание, что если вы хотите принимать только «нормальные» числа (например, 0-9), тогда вы захотите изменить функцию проверки, так как IsDigit
соответствует множеству различных представлений чисел, например
s.Count(c => c >= '0' && c <= '9') >= 7;