2011-03-06 12 views
0

어떤 종류의 테이블 구조를 저장하는 클래스를 작성하고 있습니다.이 경우 어떤 컬렉션을 사용해야합니까?

이제이 테이블 구조의 각 열에는 이름과 색인이 있습니다.

이제이 열의 각 행이 반복되며 데이터의 경우 인덱스의 경우가 아니라 열의 이름을 사용하여 데이터의 90 %가 요청됩니다.

그래서 열을 저장하는 데 좋은 데이터 구조가있어서 이름을 기반으로 색인을 매우 빠르게 검색 할 수 있습니다. 지금 나는 간단한 문자열 []을 사용하고 있습니다. 그러나 이것을 수행하는 더 빠른 방법이 있는지 궁금합니다. 코드의

부품 : 그들이 설정 한 후 열

private string[] _columns; 
private int _width; 

private int getIndex(string columnName) 
{ 
    for (int i = 0; i < _width; i++) 
    { 
     if (_columns[i] == columnName) return i; 
    } 
    return -1; 
} 

이름은 일정하게 될 것이며, 그들은 대부분이 약 10 ~ 16 자입니다.

미리 감사드립니다.

+2

사전 http://msdn.microsoft.com/en-us/library/xfhwa508.aspx –

+0

나는 사전이 키에 의해 데이터를 저장하는 데 사용 된 것으로 생각했지만, 다른 방법으로 생각됩니다. 어쨌든 벤치 마크 할 것입니다. – Aidiakapi

+0

얼마나 자주 컬렉션에 물건을 추가/제거 하시겠습니까? – Nix

답변

1

Dictionary<string,int>을 사용하여 열의 이름을 ID에 저장하십시오.

은 (채워지는 방법 _columns 그리워) 귀하의 예를 사용 :

private IDictionary<string,int> _columns; 
private int _width; 

private int getIndex(string columnName) 
{ 
    return _columns[columnName]; 
} 
+0

고정 길이 배열이기 때문에 어떻게 채워지는 것은 중요하지 않지만 알고 싶다면 for (int i = 0; i <_width; i ++) _columns [i] = GetColumnName (i); – Aidiakapi

+0

@Aidiakapi - 내가 알기를 원한다는 말은하지 않았습니다. 단지 당신 (그리고 그에 대한)이 그것을 보여주지 않았다는 것입니다. – Oded

+0

감사합니다. 벤치 마크를 실행 한 후 사전에 14760ms, 문자열 배열에 23225ms가되었습니다. _ (매번 100000000 번 조회, 두 개의 다른 값) _ 사전 작성에는 6166ms가 소요되지만 문자열 배열은 754ms _ (10000000 번 작성) _ 만 소요되지만 _ 열은 10K 회 이상 요청 될 수 있습니다. '다시 한 번 설정, 감사합니다 :) – Aidiakapi

3

당신이 보통 이름으로 열을 액세스하려고하기 때문에를,이 C#에서지도 (사전 클래스를 사용하기에 좋은 장소처럼 들린다)를 사용하여 문자열을 열 (문자열 배열)에 매핑합니다. 그것은 위의 코드에서 현재 O (n) 대신 이름에 대해 O (1) 액세스를 허용합니다.

단점은 더 이상 열 인덱스로 직접 액세스 할 수 없다는 것입니다. 그러나 이것은 간단하게 해결할 수 있습니다 - 열 이름 목록을 유지하고 색인을 사용하십시오! 번호로 색인해야하는 경우에도 O (1) 시간이 걸릴 경우

_columnsMap[_columns[index]] 

으로 전화 할 수 있습니다.

+0

좋은 설명 이유,하지만 다른 두려움의 대답은 조금 더 나은 것, 감사합니다 어쨌든 :) +1 – Aidiakapi

관련 문제