我正在使用foreach循环和Directory.GetFiles()来收集有关目录中文件的一些信息。我想存储3个字符串:Filename,FilePath,DirectoryName。我可以得到这些信息,但我想知道存储数据的最佳方法是什么。
我希望能够查找其中一个字符串,并轻松找到其他字符串。例如,如果它们在3个数组中,我可以使用forloop扫描Filename数组,并发现我想要的条目是索引45.然后我可以使用FilePath [45],DirectoryName [45]来获取条目在另外两个阵列中。
这是存储这些字符串最有效的吗?如果是这样,假设在另一种情况下,我无法预先使用GetFiles()方法获得数组的大小,那么List是否是合适的替代方法?
答案 0 :(得分:4)
如果您有三个关联值,请将它们封装在一个类型中。它不一定是一个特别复杂的类型,虽然我可能会使它不可变 - 只是从构造函数初始化的三个属性。最奇怪的是命名它,因为FileInfo
已经是System.IO
的一部分......但是假设你确定FileData
的(sucky)名称:
public sealed class FileData
{
// Or use private readonly string variables and getter-only properties
public string FileName { get; private set; }
public string Path { get; private set; }
public string DirectoryName { get; private set; }
public FileData(string fileName, string path, string directoryName)
{
FileName = fileName;
Path = path;
DirectoryName = directoryName;
}
// Optional: override methods from System.Object.
// ToString might be really handy; Equals/GetHashCode less likely.
}
这不会像三个单独的数组那样高效(就内存而言),但是使用它会更加实用,特别是对于LINQ。花时间从不处理单独的数组中获得优化位的优点。字符串占用的内存可能会使容器对象的开销相形见绌。
你可以使它成为一个结构而不是一个类,这在某些方面会稍微提高效率,而在其他方面则效率稍低。我通常会上课,除非我有充分的理由不这样做。
是的,我通常会使用List
而不是数组 - Eric Lippert has some good reasons why ......
让我困惑的一件事是:这三条信息真正正交,还是可以从目录名和文件名构建完整路径?如果是这样,你可能只存储前两个,并在需要时构造第三个。
答案 1 :(得分:1)
您可以创建一个结构来保存这三个值,将它们全部放在List中并使用Linq选择正确的项目。
您也可以使用Tuple type