// получить значение атрибута #region Public Methods and Operators /// <summary> /// The retrieve attribute. /// </summary> /// <param name="xmlNode"> /// The xml node. /// </param> /// <param name="attributeName"> /// The attribute name. /// </param> /// <param name="trimToNull"> /// The trim to null. /// </param> /// <returns> /// The <see cref="string"/>. /// </returns> public static string RetrieveAttribute(this XElement xmlNode, string attributeName, bool trimToNull = false) { var attribute = xmlNode.Attribute(attributeName); if (attribute != null) { return(trimToNull ? TStringHelper.StringToNull(attribute.Value, true) : attribute.Value); } return(null); }
// провести подготовку строки, задав тонкие настройки /// <summary> /// The prepare string. /// </summary> /// <param name="s"> /// The s. /// </param> /// <param name="field"> /// The field. /// </param> /// <param name="flagged"> /// The flagged. /// </param> /// <param name="emptyToNull"> /// The empty to null. /// </param> /// <returns> /// The <see cref="string"/>. /// </returns> /// <exception cref="InvalidCastException"> /// </exception> public string PrepareString( string s, FieldTypes field = FieldTypes.Undefined, bool flagged = false, bool emptyToNull = false) { if (s != null) { /* * следует учитывать, что после преобразований какие-то буквы могут исчезнуть, а какие-то добавиться * в результате может сложиться новая последовательность символов, которая сама по себе подлежит преобразованию * наша цель: получить некий "конечный" результат, то есть такой, который уже не будет меняться, если к нему снова и снова применить все те же преобразования * * для этого будем повторять преобразования в цикле до тех пор, пока хоть что-то в строке меняется (разумеется, с защитой от зацикливания) * поначалу предполагалось сделать кеш готовых значений, но тесты показали, что в этом нет особого смысла, потому что наличие цикла добавило всего 2-3% времени на обработку файла */ ushort cycles = 0; var original_s = s; do { // текущее значение строки var saved_s = s; // преобразование к верхнему регистру if (GlobalUpper) { s = s.ToUpper(); } // применить настраиваемые преобразования if (converters != null) { foreach (var converter in converters) { s = converter.Convert(s, field, flagged); } } // убрать боковые пробелы if (GlobalTrim) { s = s.Trim(); } // убрать лишние пробелы if (GlobalCompact) { s = TStringHelper.CompactString(s); } // прерываем цикл, когда никаких изменений в строке больше нет if (string.Compare(s, saved_s, StringComparison.Ordinal) == 0) { break; } // защита от зацикливания if (++cycles > 10000) { throw new InvalidCastException( string.Format( "TextRules.PrepareString: зацикливание! field: {0}, flagged: {1}, string: {2}", field, flagged, original_s)); } }while (true); // привести пустую строку к null if (emptyToNull) { s = TStringHelper.StringToNull(s); } } return(s); }
/// <summary> /// Initializes a new instance of the <see cref="StringMatchingBase"/> class. /// </summary> /// <param name="matcher"> /// The matcher. /// </param> protected StringMatchingBase(string matcher) { this.matcher = TStringHelper.StringToNull(matcher); }