2009-05-31 5 views
0

아래 등급을 고려하십시오.
- 대소 문자를 구분하지 않는 문자열을 구현하기 위해 어떤 작업을 수행 할 수 있습니까?
C# 대소 문자를 구별하지 않는 문자열

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); 
    } 
} 

Structure of an HTML 4 Document

내가 좋아하는,

+0

.NET Framework는 대/소문자를 구분하지 않는 문자열 비교를위한 모든 종류의 도구를 제공합니다. 그들에게 어떤 문제가 있습니까? – KovBal

+0

문제는 문자열을 참조 할 때마다 대/소문자를 구분하지 않는 비교를 사용해야한다는 것입니다. 기본 비교가 올바르게 작동 할 수 있도록 속성/유형 자체의 고유 한 특성으로 '대소 문자를 구분하지 않는'것이 좋습니다. – Timbo

답변

2

, 당신은 이런 식으로 그것을 할 수 :

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를 호출합니다.

+0

위대한 작품 좋은 솔루션 SLaks, 그리고 또한 KeyedCollection :) 본적이 없어! – divinci

2

당신은 당신은 대소 문자를 구분 작업을 할 수 있습니다 — 대소 문자를 구별 특성을 가질 수 없습니다 조금 더 객관적 클래스를 편집하고 특정 한 비교. 누군가 XHtmlOneDTDElementAttibute.Name에 액세스하면 생성 된 모든 경우와 함께 문자열을 반환합니다.

.Name을 사용할 때마다 문자열의 대/소문자를 무시하는 방식으로 해당 메서드를 구현할 수 있습니다.

+0

그래서 이것을 구현하려면 내 XHtmlOneDTDElement에서 문자열 비교 함수를 무시할 수 있을까요? – divinci

+0

예. Object.Equals 메서드를 재정의하고 IComparable을 구현하고 CompareTo를 재정의 할 수 있습니다. –

+1

divinvi : 예, 두 문자열의 대문자 변형을 비교하는 사용자 지정 문자열 비교자를 제공하십시오. 그것은 대소 문자를 구분하지 않는 비교 일 것입니다. 주의를 기울이지 않아도 일부 언어에서 이상한 대문자/소문자 규칙이 있으므로 입력에 영어 이외의 텍스트가 포함될 수 있으므로 문제가 발생할 수 있습니다. –

1

문자열과 관련된 작업에 따라 다릅니다.

대소 문자에 관계없이 문자열을 비교하려면 으로 String.Equals으로 전화하십시오. 사전에 넣으려면 사전의 비교자를 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 재산

1

음으로 무슨 일을하는지 말해 줘요, 내 걸릴 다음과 같이

따라서 함수를 만들 수 이것은 스펙을 보면서 문자열 속성을 대소 문자를 구별하지 못하게하는 것입니다. 어쨌든 개념은 실제로 이해가되지 않습니다. 문자열은 대/소문자를 구분하지 않습니다. 그들에 대한 작업 (검색 및 정렬과 같은)이 있습니다.

는 (필자는 W3C의 HTML 권장 사항은 본질적으로 그런 말을 알고있다. 그것은 심하게 표현한 것.)

1

또한,이 같은 속성이 항상 대문자하게 할 수 있습니다. 구조 조정 질문에 대한 대답에서

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; } 
} 
+0

나는 또한 XHtmlOneDTDElement & XHtmlOneDTDElementAttibute 사이에 XHtmlOneDTDElementCollection을 넣을까요 – divinci

+0

오타 : 나는 또한 XHtmlOneDTDElement & XHtmlOneDTDElementAttibute – divinci

+0

예 사이 XHtmlOneDTDAttibuteCollection을 넣어된다. KeyedCollection을 만들 수 있습니다. 내 최신 답변을 참조하십시오 – SLaks

관련 문제