我必须重写一些旧代码,我想知道处理一长串字符串的最佳方法。该列表由大约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声明名称列表不太可能改变,这是非常严重的,因为列表将被添加到的位置很小。
答案 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])
: