【问题标题】:How to convert a TStringDynArray to a TStringList如何将 TStringDynArray 转换为 TStringList
【发布时间】:2014-10-15 10:49:59
【问题描述】:

我正在使用TDirectory::GetFiles() 来获取文件列表(显然)。 结果存储在TStringDynArray 中,我想将其传输到TStringList,唯一目的是使用IndexOf() 成员查看列表中是否存在字符串。

任何让我知道某个字符串是否存在于从 TDirectory::GetFiles() 返回的文件列表中的解决方案都可以。不过,知道如何转换 TStringDynArray 会很有趣。

TStringDynArray DynFiles = TDirectory::GetFiles("Foo path");
System::Classes::TStringList *Files = new System::Classes::TStringList;

Files->Assing(DynFiles) // I know this is wrong, but it illustrates what I want to do.
if(Files->IndexOf("Bar") { // <---- This is my goal, to find "Bar" in the list of files.

}

【问题讨论】:

    标签: vcl tstringlist c++builder-xe5 tstringdynarray


    【解决方案1】:

    TStringListTStringDynArray 互不了解,因此您必须手动复制字符串:

    TStringDynArray DynFiles = TDirectory::GetFiles("Foo path");
    System::Classes::TStringList *Files = new System::Classes::TStringList;
    
    for (int I = DynFiles.Low; I <= DynFiles.High; ++I)
        Files->Add(DynFiles[I]);
    
    if (Files->IndexOf("Bar")
    {
        //...
    }
    
    delete Files;
    

    由于无论如何您都必须手动循环遍历数组,因此您可以摆脱TStringList

    TStringDynArray DynFiles = TDirectory::GetFiles("Foo path");
    
    for (int I = DynFiles.Low; I <= DynFiles.High; ++I)
    {
        if (DynFiles[I] == "Bar")
        {
            //...
            break;
        }
    }
    

    但是,如果您只对检查特定文件是否存在感兴趣,请查看TFile::Exists(),甚至查看Sysutils::FileExists()

    if (TFile::Exists("Foo path\\Bar"))
    {
        //...
    }
    

    if (FileExists("Foo path\\Bar"))
    {
        //...
    }
    

    * 就我个人而言,我讨厌 IOUtils 单元使用动态数组作为列表。它们速度慢、效率低,并且不能与 RTL 的其余部分很好地集成。但这只是我的看法。

    【讨论】:

    • 你和往常一样雷米。是的,我认为这很奇怪,有两个不兼容的类,我确信我一定错过了一些东西。但也许有一个更好的计划,所有这一切都会导致(或不会......)。我已经实现了线性搜索方法。由于我有一大堆文件要查找,我认为使用列表而不是磁盘访问会更快。谢谢雷米。
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2014-01-17
    • 2010-09-08
    相关资源
    最近更新 更多