2010-11-25 10 views
2

기본적으로 이전 파일 이름과 각 파일의 새 파일 이름을 추적하고 싶습니다.문자열 쌍 (다차원 배열?) C#

내가 사용하는 사전을 사용할 수는 있지만 실제로 가볍게 유지하려고합니다.

다차원 문자열 배열도 올바르게 작동합니까?

+1

때문에 사전에 대해 어떻게 헤비급이야? –

+0

'List '는'List '에 순서가 있지만'Dictionary '에있는 원소는 순서가 없기 때문에 더 적절할 것입니다. 'List '을 사용하면 마지막 요소가 현재 이름임을 알 수 있습니다. – Steven

답변

9

Dictionary<string,string> 클래스를 사용 : 그것은을 위해 자신의 크기를 관리

  1. 당신이 당신은 단지 이름을 가져 fileNames[oldName] 갈 수
  2. 요소를 검색하는 대신를 사용하여 속도를 해시를 사용
  3. 루프 또는 LINQ

정말 가벼운 사전 솔루션입니다.

+0

사전 <,>과 큰 오브젝트 힙에 문제가 생겼습니다. 사전 <,>은 오브젝트와 키에 대해 두 개의 배열을 유지 관리합니다. 매우 많은 파일이있는 경우 SortedDictionary <,>을 선호 할 수 있습니다. 이 클래스는 해시 테이블 대신 이진 트리로 구현됩니다. 또는 파일 수가 안정적이면 사전을 만들 때 사전의 용량을 지정해야합니다. – phoog

2

또한 StringDictionary을 사용해 볼 수도 있습니다.

공룡이 지구를 지배 할 때까지 제네릭 전의 땅에서 사용되었습니다.

1

가벼운 당신의 정의는 무엇입니까? 메모리 사용이나 런타임에 대해 걱정하십니까?

다차원 문자열 배열을 사용하면 배열을 직접 검색해야합니다. 배열을 정렬하고 이진 검색을 수행 할 수는 있지만 일반적으로 해시 테이블만큼 좋지는 않습니다. 액세스 할 때 런타임에 손실이 발생합니다.

다차원 문자열 배열을 사용하면 메모리를 할당하기 위해 필요한 항목의 수를 미리 알고 있어야합니다. 그렇게하지 않으면, 시간이 걸리고 점점 커지는 배열을 재배치하는 메모리를 분해 할 수 있습니다. 사전은 연속적인 메모리 영역을 사용하지 않으므로 확장시 재 할당하지 않습니다.

마지막으로 메모리 프런트에서 문자열이 참조임을 명심하십시오. 당신이 볼 수있는 메모리 사용의 차이는 조회 구조와 관련이있을뿐입니다. 추적 구조를 유지하고자하는 데이터와 비교하면 아마도 작을 것입니다. 캐시 효율을 위해 연속적인 메모리 블록을 유지하는 것이 염려스러운 경우, 문자열은 데이터 구조 외부에 저장되므로 (참조) 모든 문자열 읽기가 해당 연속성을 잃어 버리게되므로 해결 방법이 다른 것보다 우수하지 않습니다.

결론적으로 다차원 배열을 사전에 사용할 이유가 없습니다.

+1

실제로 사전은 실제로 연속적인 메모리 영역을 사용합니다. 두 개의 배열 (int 중 하나와 데이터 노드 중 하나)이 있습니다. 이들은 적어도 항목 수만큼 큰 크기로 유지됩니다. 확장시 사전에 용량이있는 경우 사전은 이전 배열보다 두 배 이상 큰 두 개의 새 배열을 할당합니다. 새로운 배열에 데이터를 복사하고 이전 배열로 대체합니다. 그러나 SortedDictionary는 이진 트리이므로 메모리의 큰 연속 영역을 사용하거나 확장시 다시 할당하지 않습니다. 나는 아직도 당신의 결론에 동의합니다. :) – phoog

+0

Thanks phoog. 나는 내부 해시 테이블이 이것이 가장 인기있는 접근 방식인데, 묶여있는 버킷 목록의 대부분 고정 된 배열로 구현되었다고 생각했지만, 현재 구현에 대해 읽었을 때 나는 그 순진함에 다소 실망했다. –

1

추가하기 만하면이 링크는 성능에 대한 분석을 제공합니다. 누군가에게 도움이 될 수 있습니다.

시나리오에 Dictionary<string,string>를 사용에 대한 문제는 당신이 열쇠로 '이전 파일 이름'을 사용하는 경우, 그래서 모든 키가 당신은이 개 시나리오를 가질 수 없습니다, 고유 필요가있다

Performance Analysis

3

곳 '오래된 파일 이름 '이 같았습니다.

(내 생각에) 가장 좋은 방법은 또한 최신 함께 주문한다

List<Tuple<string,string>> 

등 마지막 추가된다

새 항목은

List<Tuple<string,string>> list = new List<Tuple<string, string>>(); 

list.Add(Tuple.Create(oldfilename,newfilename)); 

과 같을 것이다 다음 당신이 할 수있는 특정 이전 파일 이름 다음에 모든 새 파일을 찾을 수 :

var files = list.Where(t => t.Item1 == oldfilename);