3组相应的字符串。如何最好的存储?

时间:2011-08-13 08:17:10

标签: c# .net

我正在使用foreach循环和Directory.GetFiles()来收集有关目录中文件的一些信息。我想存储3个字符串:Filename,FilePath,DirectoryName。我可以得到这些信息,但我想知道存储数据的最佳方法是什么。

我希望能够查找其中一个字符串,并轻松找到其他字符串。例如,如果它们在3个数组中,我可以使用forloop扫描Filename数组,并发现我想要的条目是索引45.然后我可以使用FilePath [45],DirectoryName [45]来获取条目在另外两个阵列中。

这是存储这些字符串最有效的吗?如果是这样,假设在另一种情况下,我无法预先使用GetFiles()方法获得数组的大小,那么List是否是合适的替代方法?

2 个答案:

答案 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