텍스트 파일 쓰기를 정확히 다음과 같습니다.
Acme.*.MinimumPrice = 100
Acme.ProductA.MinimumPrice = 50
Acme.ProductB.MinimumPrice = 60
Acme.ProductC.DefaultColor = Blue
경로/값 쌍 seque로 구문 분석하십시오. nce :
foreach (var pair in File.ReadAllLines(configFileName)
.Select(l => l.Split('='))
.Select(a => new { Path = a[0], Value = a[1] }))
{
// do something with each pair.Path and pair.Value
}
이제 원하는 작업에 대한 두 가지 해석이 가능합니다. Acme.*.MinimumPrice
문자열은 Acme.Toadstool.MinimumPrice
과 같이 특정 재정의가없는 조회의 경우 파일의 어느 곳에서나 Toadstool
을 참조하는 것이 없더라도 100
을 반환한다는 것을 의미 할 수 있습니다. 또는 파일에 Toadstool
의 다른 특정 언급이있는 경우에만 100
을 리턴해야 함을 의미 할 수도 있습니다.
전자의 경우 전체 사전을 평면 사전에 저장할 수 있으며 조회시 일치하는 항목을 찾을 때까지 다른 유형의 키를 계속 시도 할 수 있습니다.
후자의 경우 실제로 존재하지 않는 값을 반환하지 않으려면 경로 구조에서 실제로 발생하는 모든 이름의 데이터 구조를 작성해야합니다. 이것은 나에게 더 믿을만한 것 같습니다.
후자의 옵션을 사용하면 Acme.*.MinimumPrice
은 실제로 "이 MinimumPrice 값을 자체적으로 정의 된 값이없는 제품에 추가"라고 말합니다.
Acme.ProductA.MinimumPrice = 50
Acme.ProductB.MinimumPrice = 60
Acme.ProductC.DefaultColor = Blue
Acme.ProductC.MinimumPrice = 100
이의 좋은 점은 당신은 단지 필요가있다이다 : 이것은 당신이 기본적으로 설정 파일의 완성 된 버전에 해당하는로를 확대, 모든 별표를 제거하는 구문 분석시에는 쌍을 처리 할 수 있음을 의미 플랫 표현 사전을 최종 표현으로 사용하면 내용을보기 위해 TryGetValue
또는 []
을 사용할 수 있습니다. 그 결과는 훨씬 더 클 수 있지만 설정 파일의 크기에 따라 다릅니다.
당신 수 저장 정보 더 최소한의, 그러나 나는으로 시작하고, 정말로 밝혀지면 나중에 다시 구현할 수 있도록 그것을 아주 간단한 API를 제공하기 위해 노력하고 간단한 뭔가 갈 것 필요하다. 룩업 프로세스를 더 복잡하게 만드는 것이 (응용 프로그램에 따라) 전체적으로 더욱 악화 될 수 있음을 알 수 있습니다.
편집을 참조하십시오. 나는이 모든 것을 하드 코딩하지 않을 것입니다. 그래서 두 번째 대답은 100이 사전에도 저장된다는 것을 제외하고는 거의 좋은 결과입니다. –
@JC 왜 원래 질문이 애매한 지 내게 투표 한 이유가 확실하지 않습니다. – JaredPar