2011-12-10 3 views
0

일부 오래된 코드를 다시 작성해야하며 긴 문자열 목록을 처리하는 가장 좋은 방법이 궁금합니다. 목록은 약 100 개의 항목으로 구성되어 있으며 각 항목은 "[parentfolder] .zip"이라는 zip 아카이브에 추가 될 여러 파일을 포함 할 수있는 폴더와 일치하는 데 사용됩니다.문자열 목록 처리에 대한 모범 사례

현재 코드보기

string[5] list = {"a", "b", "c", "d", "e"}; 

    for (int i = 0; i < 5; i++){ 
     // open folder for list[i] 
     if (Directory.Exists(string.Format("c:\\{0}", i))){ 
      // get files and add them to list[i].zip 

      // do some work with archive 
     } 
    } 

폴더 이름 목록은 변경 될 가능성이 적지 만 가능성은 낮습니다.

제 질문은 폴더 목록을 처리하는 가장 좋은 방법은 무엇입니까? 문자열의 배열은 분명히 최적이 아닙니다. 이 '목록'은

의 오류를 쉽게 만들 수처럼 보인다 내가 열거를 사용하여 생각했지만, 다른 제안을 환영 경우

죄송합니다 (항목 이름은 BTW 단 세 글자는 보통) 이것은 바보 같은 질문처럼 보인다;)

EDIT : orginally는 이름 목록이 변경 될 가능성이 없다고 말하면서 목록이 추가 될 작은 기회가 있기 때문에 이것은 매우 잘못 표현되었다.

+0

은 생성 가능한 폴더 이름입니까? –

+4

기존 코드에 문제가 있습니까? – Snowbear

+2

실제로 여기에서 무엇을 묻고 있는지 확실하지 않습니다. –

답변

1

이와 같은 시나리오가 발생하면 파일 (XML 또는 텍스트)을 작성하는 경향이 있습니다. 또한 폴더 이름이 변경되거나 새로운 폴더 이름이 필요할 경우 코드를 업데이트 할 필요가 없다는 이점이 있습니다.당신은 그 두 가지 경우 중 어느 것도 발생하지 않을 것이므로 이점이 다소 상실되었다고 언급했습니다. 목록에서 읽는 것과 관련된 IO 작업 때문에이 옵션이 더 느리므로 언급 한 이점이 필요하지 않은 경우 좋은 지침이 아닐 수도 있습니다.

변경되거나 추가되는 항목을 볼 수없는 경우 목록 또는 배열이 가장 적합합니다.

+0

목록은 변경 될 것 같지 않지만 사실이지만 항상 변경 될 수 있습니다. – crunchy

+0

@ user1091479 목록이 변경되지는 않았지만 항상 오타가 발생할 수 있습니다 :) 이제 매번 다시 컴파일하거나 다시 배포하거나 XML/텍스트 파일을 업데이트 할 수 있습니다. :) –

1

Enum은 C#에서 문자열 기반 열거를 사용할 수 없으므로 작동하지 않습니다.

이러한 열거 형에 가장 가까운 것은 많은 공개 상수입니다.

두 옵션 모두 위에 열거 할 수 없으므로 좋지 않습니다.

어레이 옵션이 나쁘지는 않습니다. 귀하의 반대 의견이 확실하지 않습니다. - 그러나 for 루프를 사용할 필요가 없습니다 당신은이 작업을 수행 할 수 있습니다

string[5] list = {"a", "b", "c", "d", "e"}; 

foreach(string dirName in list){ 
    // open folder for list[i] 
    if (Directory.Exists(string.Format("c:\\{0}", i))){ 
     // get files and add them to list[i].zip 

     // do some work with archive 
    } 
} 
0

정말 배열을 사용하여 어떤 문제가 표시되지 않습니다. 왜 "분명히 최적"이 아닌가?

여기서 열거 형이 적절하지 않은 것 같습니다. 일반적으로 폴더 이름과 같은 구체적인 항목을 설명하는 목록이 아닌 항목을 분류해야 할 때 사용됩니다. 게다가 열거 형 값을 직접 사용할 수는 없으므로 열거 형 값을 먼저 문자열로 변환해야합니다.

2

왜 문자열 배열이 최적이 아니라고 생각합니까?

배열은 가장 간단한 형식의 컬렉션이며 List<T>Dictionary<T>과 같은 대부분의 컬렉션의 내부 저장소로 사용됩니다. 어레이가 귀하의 필요를 충족 시키므로, 그것은 분명히 선택되어야합니다.

string[] list = {"a", "b", "c", "d", "e"}; 

foreach (string name in list) { 
    // open folder for list[i] 
    if (Directory.Exists(string.Format("c:\\{0}", name))){ 
     // get files and add them to list[i].zip 

     // do some work with archive 
    } 
} 

참고 : 원래 코드에서이 이름을 얻기 위해 i 대신 list[i]의를 사용하고

당신은 루프에 코드를 조금 청소기를 만드는 배열을 열거를 사용할 수 있습니다. 또한 루프 길이를 확인하려면 5 대신 list.Length을 사용해야합니다.

+0

당신은 내가 말하고자했던 바를 말했습니다 : 1) 본질적으로 배열에 문제가 없으며 완전히 적합 할 수 있습니다. 2) 다른 컨테이너 유형 (예 : List < > 또는 사전 <>). 3) "foreach (type)"는 "for (int i)"에 대한 훌륭한 대안입니다. "문자열"을 사용하여 문자열 데이터를 조작하는 것보다 "텍스트"를 사용하는 것이 훨씬 더 효율적일 수 있다는 점도 추가 할 것입니다. – paulsm4

+0

배열이 최적이 아닐 때 목록이 변경 될 가능성이 거의 없지만 항상 약간의 가능성이 있기 때문에 코드를 변경해야합니다. 분명히, 내가했던 것처럼 그것을 배제하는 대신에 질문에이를 표시해야했습니다. – crunchy

+0

@ user1091479 : 프로그램을 실행하는 동안 목록이 변경됩니까? 그렇지 않으면 배열을 사용하지 않아도됩니다. 예를 들어 파일에서 이름을 읽는 경우,'File.ReadAllLines' 메쏘드는 문자열 배열을 반환합니다. – Guffa

0

배열은 일종의 반 다이나믹입니다. 디자인 타임에 크기를 알 필요는 없지만 만든 후에는 크기를 변경할 수 없습니다. 그러나 목록은 동적으로 커질 수 있으며 .NET Framework에서 널리 사용됩니다. 목록을 사용할 때 어떤 문제도 나타나지 않습니다. 열거 형은 완전히 다른 것입니다. 그것들은 명명 된 상수 세트를 나타냅니다.

List<string> directories = new List<string>(); 
int i = 0; 
while (true) { 
    string dir = string.Format("c:\\{0}", i++); 
    if (Directory.Exists(dir)) { 
     directories.Add(dir); 
    } else { 
     break; 
    } 
} 

편집 : 코드 예제가 정확하면 나는 확실하지 않다 참고. list에 테스트 할 디렉토리 이름이 포함되어 있다고 가정하면
string.Format("c:\\{0}", list[i])과 함께 디렉토리 이름을 만들어야합니다.