C # без учета регистра строки - PullRequest
0 голосов
/ 01 июня 2009

Учитывая класс ниже
- Могу ли я сделать что-нибудь для реализации строки без учета регистра?

public class Attibute
{
    // The Name should be case-insensitive
    public string Name
    {
        get;
        set;
    }

    public Attibute()
    {
    }
}

public class ClassWithAttributes
{
    private List<Attributes> _attributes;

    public ClassWithAttributes(){}

    public AddAttribute(Attribute attribute)
    {
        // Whats the best way to implement the check?
        _attributes.add(attribute);
    }
}

Структура документа HTML 4

Я отредактировал класс, чтобы он был более объективным и конкретным

Ответы [ 5 ]

2 голосов
/ 01 июня 2009

В ответ на реструктурированный вопрос вы можете сделать это так:

public class Attribute { public string Name { get; set; } }

public class AttributeCollection : KeyedCollection<string, Attribute> {
    public AttributeCollection() : base(StringComparer.OrdinalIgnoreCase) { }
    protected override string GetKeyForItem(Attribute item) { return item.Name; }
}

public class ClassWithAttributes {
    private AttributeCollection _attributes;

    public void AddAttribute(Attribute attribute) {
        _attributes.Add(attribute);    
        //KeyedCollection will throw an exception
        //if there is already an attribute with 
        //the same (case insensitive) name.
    }
}

Если вы используете это, вы должны либо сделать Attribute.Name доступным только для чтения, либо вызывать ChangeKeyForItem при каждом его изменении.

2 голосов
/ 01 июня 2009

У вас не может быть свойств без учета регистра - вы можете использовать только операции без учета регистра, например, сравнение. Если кто-то получит доступ к XHtmlOneDTDElementAttibute.Name, он вернет строку в любом случае, с которым он был создан.

Всякий раз, когда вы используете .Name, вы можете реализовать этот метод таким образом, чтобы игнорировать регистр строки.

1 голос
/ 01 июня 2009

В качестве альтернативы вы можете использовать свойство всегда в верхнем регистре, например так.

public class XHtmlOneDTDElementAttibute : ElementRegion {
    string name;

    // The Name should be case-insensitive
    public string Name {
        get { return name; }
        set { name = value.ToUpperInvariant(); }
    }

    // The Value should be case-sensitive
    public string Value { get; set; }
}
1 голос
/ 01 июня 2009

Что ж, я взялся за это, взглянув на спецификацию, что ничего не нужно делать, чтобы сделать свойства строки нечувствительными к регистру. В любом случае, концепция не имеет смысла: строки не чувствительны к регистру и не чувствительны; операции над ними (например, поиск и сортировка).

(Я знаю, что рекомендации W3C по HTML говорят, по сути, об этом. Это плохо сформулировано.)

1 голос
/ 01 июня 2009

Это зависит от того, что вы пытаетесь сделать со строками.

Если вы хотите сравнить строки независимо от регистра, позвоните String.Equals с StringComparison.OrdinalIgnoreCase. Если вы хотите поместить их в словарь, сделайте компаратор словаря StringComparer.OrdinalIgnoreCase.

Следовательно, вы могли бы сделать функцию следующим образом:

public class XHtmlOneDTDElementAttibute : ElementRegion {
    public bool IsTag(string tag) {
        return Name.Equals(tag, StringComparison.OrdinalIgnoreCase);
    }

    // The Name should be case-insensitive
    public string Name { get; set; }

    // The Value should be case-sensitive
    public string Value { get; set; }
}

Если вам нужно более конкретное решение, скажите, пожалуйста, что вы делаете со свойством Name

...