2009-11-30 9 views
0

나는 첫 번째 문자열, 키의 절대 변경해야합니다 .. 그것은 삭제할 수 없거나 아무것도 ..하지만 값은, 내가 계속 라인을 추가하고 계속 라인, 라인을 값으로 바꾼다. 나는 단지 \ r \ n 또는 \ r ..로 새 라인을 만든다. 그리고 마지막 50 라인 만 유지하는 가장 쉬운 방법이 궁금하다. 그리고 50 라인 이상 아무것도 삭제할 수 있습니다. 내가 그것을 반환 할 때 나는 문자 배열을 통해 값을 넣고 각 문자를 통해 이동해야하므로 너무 많은 데이터가 있으면 느려질 수 있습니다. 어떤 제안?문자열에서 선 제거 + C에서 사전에서 오래된 항목

답변

1

회선을 연결하는 대신 Dictionary<string, List<string>>을 사용하십시오. 당신이 목록에 문자열을 추가하려고하면 목록이 이미 50 개 문자열이있는 경우에는 수를 확인하고 첫 번째 문자열을 제거 할 수 있습니다

List<string> list; 
if (!theDictionary.TryGetValue(key, out list)) { 
    theDictionary.Add(list = new List<string>()); 
} 
if (list.Count == 50) { 
    list.RemoveAt(0); 
} 
list.Add(line); 
+0

내 프로그램이 문자열을 읽는 방식 때문에 불가능합니다. – caesay

+0

@sniperX : 왜 그런가요? – Guffa

+0

@Guffa : 가능 합니다만, 결국 ID는 내 프로그램과 함께 사용하기 위해 하나의 큰 문자열로 컴파일해야합니다. 이드는 기본적으로 원을 그리며 돌아 다니고 있습니다. 큰 문자열에서 문자열 목록으로, 다시 큰 문자열로, 나는이 점을 보지 못합니까? – caesay

2

Guffa의 일반적인 생각이 옳다 - 데이터 구조가 반영되어야 실제로 무엇을 이 문자열은 문자열 목록이 아니며 단일 문자열이 아닌입니다. "마지막 50 줄"의 개념은 원래 한 줄로 읽었을지라도 하나의 줄이 아니라 콜렉션과 관련이 있습니다.

그러나 List<T>의 첫 번째 요소를 제거 할 때마다 List<T>이 아닌 LinkedList<T>을 사용하는 것이 좋습니다. 다른 모든 것은 뒤섞여 야합니다. List<T>은 무작위 액세스를 제공하고 끝까지 추가하는 데 그리 좋지 않지만 처음부터 제거하는 것을 싫어합니다. LinkedList<T>은 반복자 액세스를 제공하고, 시작 부분에 추가/제거하고, 끝 부분에 추가/제거하는 데 유용합니다. 그것은 더 적합합니다. (정말로 마을에 가길 원한다면 논리를 캡슐화 한 고정 크기의 원형 버퍼 유형을 쓸 수도 있습니다. 이것은 두 세계의 장점을 모두 제공 할 것입니다. 특정 크기 이상으로 확장하십시오.)

Guffa의 답변에 대한 귀하의 의견에 관하여 : 입력을 처리하기에 더 적합한 양식으로 변환 한 다음 다시 출력용으로 원래 형식으로 변환하는 것이 일반적입니다. 당신이 그것을하는 이유는 정확하게 "더 적절한"비트입니다. "사전 업데이트"작업 인 IMO의 일부로 줄 바꿈 문자열을 구문 분석하지 않아도됩니다. 특히, 을 소개하는 것처럼 들리 겠지만 원본 텍스트가 문자열로 읽히는 "줄"아이디어가 있습니다. 줄 바꿈으로 문자열을 구분하여 문자열로 묶인 고유 한 "콜렉션"클래스를 효과적으로 만들 수 있습니다. 이는 비효율적이고 오류가 발생하기 쉽고 내장 된 컬렉션을 사용하는 것보다 관리하기가 훨씬 어렵습니다. 원하는 경우 끝 부분에서 줄 바꿈 구분 문자열로 쉽게 변환 할 수 있지만 너무 일찍 끝내는 것처럼 들립니다.