문제

이게 가능해? C#은 불변의 현을 사용한다는 점을 감안할 때 다음의 선을 따라 방법이있을 것으로 예상 할 수 있습니다.

var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);

그러한 기능이 없다면 왜 현을 불변으로 만드는 데 귀찮게합니까? 또는 다른 이유로 문자열이 이미 불변이라면이 방법을 제공하지 않겠습니까?

내가 이것을 조사하고있는 구체적인 이유는 파일 구문 분석을 수행하는 것입니다. 간단한 재귀 하강 파서 (예 : Tinypg에 의해 생성 된 파서 또는 손으로 쉽게 쓴 파서)는 모든 곳에서 서브 스트링을 사용합니다. 이것은 당신이 그들에게 큰 파일을 구문 분석 할 때 메모리 휘트를 믿을 수 없다는 것을 의미합니다. 물론 해결 방법이 있습니다 - 기본적으로 자신의 하위 문자열 클래스를 굴린 다음 STARTSWITH 또는 REGEX와 같은 문자열 라이브러리와 같은 문자열 메소드를 사용할 수 있다는 것을 잊어 버리므로 자체 버전의 버전도 롤링해야합니다. Antlr과 같은 파서 생성기는 기본적으로 그렇게한다고 가정하지만, 내 형식은 그러한 몬스터 도구를 사용하는 것을 정당화하지 않을 정도로 간단합니다. Tinypg조차도 아마도 과잉 일 것입니다.

누군가 내가 명백하거나 명백하지 않은 표준 C# 메소드 호출 어딘가에서 내가 놓치고 있다고 말해줘 ...

도움이 되었습니까?

해결책

아니요, 그런 것은 없습니다.

.NET 문자열에는 숯 배열, 오프셋 및 길이를 참조하는 Java 문자열과 달리 텍스트 데이터가 직접 포함됩니다.

두 솔루션 모두 어떤 상황에서는 "승리"하고 다른 상황에서는 손실이 있습니다.

당신이 절대적으로 확실한 이것은 당신을위한 킬러가 될 것입니다. 당신은 당신의 내부 API에 사용할 Java 스타일 스트링을 구현할 수 있습니다.

다른 팁

내가 아는 한, 모든 더 큰 파서는 스트림을 사용하여 구문 분석합니다. 당신의 상황에 적합하지 않습니까?

.NET 프레임 워크가 지원됩니다 문자열 인턴. 이것은 부분 솔루션이지만 문자열의 일부를 재사용 할 수있는 가백성을 제공하지 않습니다. 하위 문자를 재사용하면 첫 번째 모습에서는 그다지 명백하지 않은 문제가 발생할 것이라고 생각합니다. 당신이 StringBuilder 갈 길입니다.

C#의 어떤 것도 당신이 찾고있는 상자 외 기능을 제공하지 않습니다.

원하는 것은 로프 데이터 구조, O (1) Concats 및 O (log n) 하위 문자를 지원하는 불변의 데이터 구조. 로프의 C# 구현을 찾을 수는 없지만 여기 자바 하나.

그것을 제외하고, 그것이 일을 끝내는 가장 쉬운 방법이라면 Tinypg 또는 antlr를 사용하는 데 아무런 문제가 없습니다.

글쎄, 당신은 "안전하지 않은"을 사용하여 메모리 관리를 직접 수행 할 수 있으며,이를 통해 원하는 작업을 수행 할 수 있습니다. 또한 StringBuilder 클래스는 문자열을 여러 번 조작 해야하는 상황에 적합합니다. 각 조작마다 새 문자열을 만들지 않기 때문입니다.

"저렴한"을 나타내는 사소한 수업을 쉽게 쓸 수 있습니다. 그것은 단지 서브 스트링의 시작과 서브 스트링의 길이를 유지합니다. 몇 가지 방법을 사용하면 필요할 때 하위 문자열을 읽을 수 있습니다. 문자열 캐스트 연산자는 사용할 수있는대로 이상적입니다.

string text = myCheapObject;

마치 실제 문자열 인 것처럼 완벽하게 작동합니다. StartSwith와 같은 몇 가지 편리한 방법에 대한 지원을 추가하는 것은 빠르고 쉽습니다 (모두 하나의 라이너 일 것입니다).

다른 옵션은 일반 파서를 작성하고 여러 사본을 보관하지 않고 토큰에 대한 참조를 공유하는 사전에 토큰을 저장하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top