2017-05-17 11 views
2

나는 대소 문자 구분은 IList를 만들려면 다음 코드를하려고 해요에서 IList의 구분하지 않는 경우를 작성하고 사용하는 : 어떻게 Spring4d

procedure TForm1.ListButtonClick(Sender: TObject); 
var 
    MyList: IList<string>; 
begin 
    MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase()); 
    MyList.AddRange(['AAA', 'BBB', 'CCC']); 
    Memo1.Lines.Add(MyList.IndexOf('aaa').ToString); 
end; 

같이 IndexOf 호출이 항상 반환 그러나 -1. 이게 효과가 있니? 어떤 제안도 감사합니다.

업데이트 : 비교자를 정렬하는 데 사용하는 것처럼 보이지만 IndexOf는 그렇지 않습니다. 별도의 "EqualityComparer"가 IndexOf에 사용되므로 질문을 변경하는 방법이됩니까?

갱신 2 : 난 그냥 목록은 다음과 같이 만들 수 있습니다 요한의 대답에 추가하고 싶었 :

MyCIList := TCaseInsensitiveList<string>.Create(
    TStringComparer.OrdinalIgnoreCase(), 
    TStringComparer.OrdinalIgnoreCase()); 

답변

1

이 문제는 Spring4D 핫픽스 1.2.1에서 해결되었습니다. 변경 사항과 함께 아래 코드는 예상대로 작동합니다.

procedure TForm1.ListButtonClick(Sender: TObject); 
var 
    MyList: IList<string>; 
begin 
    MyList := TCollections.CreateList<string>(TStringComparer.OrdinalIgnoreCase()); 
    MyList.AddRange(['AAA', 'BBB', 'CCC']); 
    Memo1.Lines.Add(MyList.IndexOf('aaa').ToString); // Correctly returns 0. 
end; 
+0

좋아요! 이 기능이 필요합니다. 언급 한 spring4d spring4d 1.2.1 핫픽스를 찾을 수 없지만, 스프링 1.2는 날짜가 2017-11-03입니다. –

1

같이 IndexOf의 코드는 다음과 같습니다

function TList<T>.IndexOf(const item: T; index, count: Integer): Integer; 
begin 
    Result := TArray.IndexOf<T>(fItems, item, index, count, EqualityComparer); 
end; 

EqualityComparer가있다 GetEqualityComparer를 호출하는 속성 :

protected 
    class function GetEqualityComparer: IEqualityComparer<T>; static; 

static은 자식 클래스에서 메서드를 재정의 할 수 없음을 의미합니다.

당신은 봄의 소스를 편집하고 다음과 같이 변경해야 : 지금 당신은 만들 수 있습니다

103: TEnumerableBase<T> = class abstract(TEnumerableBase, IEnumerable<T>) 
106: protected 
108: class var fEqualityComparer: IEqualityComparer<T>; 
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
//Move this line from private to the protected section. 
....... 

                   ^^^^^^^^ 

을 Spring.Collections.Base

을 자신의 TCaseInsensitiveList과 같이 :

type 
    TCaseInsensitiveList<T> = class(Spring.Collections.TList<T>) 
    constructor Create(const Comparer: IComparer<T>; 
         const EqualityComparer: IEqualityComparer<T>); 
    end; 
    ..... 
constructor TCaseInsensitiveList<T>.Create(
      const Comparer: IComparer<T>; 
      const EqualityComparer: IEqualityComparer<T>); 
begin 
    inherited Create(Comparer); 
    Self.fEqualityComparer:= EqualityComparer; 
end; 

또는 GetEqualityComparer 클래스 함수를 가상 및 오버 라이언트로 선언 할 수 있습니다. 그게 자식 수업에서.

GetEqualityComparer을 가상으로 만드는 데 드는 비용이 있습니다. 따라서 기본 클래스 변수가 보호되도록 선택합니다.

+0

매우 좋습니다! 작은 노트 (클래스는 (Spring.Collections.Lists.TList ) 클래스 여야 함) Spring4D 문제 추적기에서이 문제를 언급했음을 확인했습니다 ... 감사합니다. – MarkF