处理字符串列表的最佳实践

时间:2011-12-10 18:16:05

标签: c# .net

我必须重写一些旧代码,我想知道处理一长串字符串的最佳方法。该列表由大约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
        }
    }

文件夹名称列表不太可能改变,但它的可能性很小。

我的问题是处理文件夹列表的最佳方法是什么?字符串数组显然不是最佳的。我正在考虑使用Enum,但欢迎任何其他建议,因为这个'列表'似乎很容易在

中出错

(项目名称通常只有三个字母btw)

对不起,如果这看起来像一个愚蠢的问题;)

编辑:orginally声明名称列表不太可能改变,这是非常严重的,因为列表将被添加到的位置很小。

5 个答案:

答案 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]来获取名称。此外,您应使用list.Length代替5来确定循环的长度。

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

当我遇到这样的场景时,我倾向于将它们写入文件(xml或文本)。如果文件夹名称改变或者需要引入新的代码,这也增加了不必更新代码的优点。你提到这两种情况都不可能发生,因此有些损失。由于读取列表中涉及的IO操作,此选项较慢,因此如果您不需要我提到的好处,那么它可能不是一个好的方向。

最后,如果您看不到更改或添加的项目,列表或数组最适合。

答案 3 :(得分:0)

我真的没有看到使用数组有任何问题。为什么它“显然不是最佳的”?

这里的枚举似乎不够。它们通常在您需要对某些内容进行分类时使用,而不是用于保存描述某些具体项目(如文件夹名称)的列表。此外,您不能直接使用枚举值,您需要先将它们转换为字符串。

答案 4 :(得分:0)

数组是一种半动态的。您无需在设计时知道其大小,但在创建后无法更改其大小。但是,List可以动态增长,并在.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])

相关问题