Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配文件路径字符串的第一部分_C#_Optimization_Memory Management - Fatal编程技术网

C# 匹配文件路径字符串的第一部分

C# 匹配文件路径字符串的第一部分,c#,optimization,memory-management,C#,Optimization,Memory Management,我有一个简单的类,如下所示: class Record { public Record(string fp1, string fp2, string fp3) { Filepath1 = fp1; Filepath2 = fp2; Filepath3 = fp3; } public string Filepath1 { get; private set; } public string Filepath2

我有一个简单的类,如下所示:

class Record
{
    public Record(string fp1, string fp2, string fp3)
    {
        Filepath1 = fp1;
        Filepath2 = fp2;
        Filepath3 = fp3;
    }

    public string Filepath1 { get; private set; }
    public string Filepath2 { get; private set; }
    public string Filepath3 { get; private set; }
}
这些文件路径中的每一个都非常相似且非常长,只在文件路径的最后几个字符上有所不同

现在,我希望在内存中有几千条这样的记录,我希望这些记录占用更少的内存。因此,我正在努力思考优化内存使用的方法,下面是我提出的一个解决方案:

class Record
{
    private string _baseFilepath;
    private string _fp1;
    private string _fp2;
    private string _fp3;
    public Record(string fp1, string fp2, string fp3)
    {
        _baseFilepath = /*get common first part of filepaths*/;
        _fp1 = /*last part of fp1*/;
        _fp2 = /*last part of fp2*/;
        _fp3 = /*last part of fp3*/;
    }

    public string Filepath1
    {
        get { return _baseFilepath + _fp1; }
    }

    public string Filepath2
    {
        get { return _baseFilepath + _fp2; }
    }

    public string Filepath3
    {
        get { return _baseFilepath + _fp3; }
    }
}
您可以看到,我可以节省大量RAM,特别是对于非常长的文件路径,其中只有最后几个字符是不同的。问题是,有没有一种简单的方法来获取文件路径的公共第一部分

编辑: 内存中可能有多达700000条记录,而实际的生产类还有多个文件路径。我正试图使应用程序尽可能轻量级,同时为了简单起见,尽量使优化过程极其简单。

这样做可以:

public static string GetCommonStart(string fp1, string fp2, string fp3)
{
    int idx = 0;
    int minLength = Math.Min(Math.Min(fp1.Length, fp2.Length), fp3.Length);
    while (idx < minLength && fp1[idx] == fp2[idx] && fp2[idx] == fp3[idx])
       idx++;
    return fp1.Substring(0, idx);
}
这可以做到:

public static string GetCommonStart(string fp1, string fp2, string fp3)
{
    int idx = 0;
    int minLength = Math.Min(Math.Min(fp1.Length, fp2.Length), fp3.Length);
    while (idx < minLength && fp1[idx] == fp2[idx] && fp2[idx] == fp3[idx])
       idx++;
    return fp1.Substring(0, idx);
}

如果此操作对您的性能不重要,您可以使用类似的方法:

public static class StringExtensions
{
    public static string GetCommonPrefix(string a, string b)
    {
        int commonPrefixLength = 0;
        int minimumLength = Math.Min(a.Length, b.Length);

        for (int i = 0; i < minimumLength; i++)
        {
            if (a[i] == b[i])
            {
                commonPrefixLength++;
            }
        }

        return a.Substring(0, commonPrefixLength);
    }

    public static string GetCommonPrefix(params string[] strings)
    {
        return strings.Aggregate(GetCommonPrefix);
    }
}

如果此操作对您的性能不重要,您可以使用类似的方法:

public static class StringExtensions
{
    public static string GetCommonPrefix(string a, string b)
    {
        int commonPrefixLength = 0;
        int minimumLength = Math.Min(a.Length, b.Length);

        for (int i = 0; i < minimumLength; i++)
        {
            if (a[i] == b[i])
            {
                commonPrefixLength++;
            }
        }

        return a.Substring(0, commonPrefixLength);
    }

    public static string GetCommonPrefix(params string[] strings)
    {
        return strings.Aggregate(GetCommonPrefix);
    }
}

请考虑这是一个补充答案,提供一个替代的建议,而不是对已经提供的问题的直截了当的回答。 如果可能的话,我会在第一个可能的机会将这些文件路径分为基本路径和后缀路径&然后以这种方式通过整个系统

这适用于以下情况:

您自己在系统中的某个地方生成这些文件路径 您正在从一组已知且有限的位置读取文件 您只需要有一组基本文件路径,每个文件路径引用这些基本值中的一个,并且还包含自己的后缀值


根据基本文件路径的数量以及它们的确定方式,这将大大提高内存效率。您当前的解决方案提供了最佳情况三分之一的内存使用每三个文件路径最好优化为一个文件路径。在整个应用程序中以一致的方式存储这个对象文件是有意义的。

< P>请考虑这是一个补充的答案,提供一个替代的建议,而不是对已经提供的问题的直接回答。 如果可能的话,我会在第一个可能的机会将这些文件路径分为基本路径和后缀路径&然后以这种方式通过整个系统

这适用于以下情况:

您自己在系统中的某个地方生成这些文件路径 您正在从一组已知且有限的位置读取文件 您只需要有一组基本文件路径,每个文件路径引用这些基本值中的一个,并且还包含自己的后缀值


根据基本文件路径的数量以及它们的确定方式,这将大大提高内存效率。您当前的解决方案提供了最佳情况三分之一的内存使用每三个文件路径最好优化为一个文件路径。在整个应用程序中以一致的方式存储此对象文件路径也是有意义的。

数千条记录将占用大约一兆字节。你是在严重受限的硬件上操作的吗?实际上,这要看情况而定。这是针对服务器应用程序的,每个连接到服务器的用户可能会导致内存中出现4000条记录。哦,这不是我的生产类,只是一个示例。现实生活中会有更多的文件路径。这是一个真实的文件路径,还是你只是这样命名的?如果是这样的话,它们是否只在实际文件名上有所不同,而您希望分割出路径?如果这是任务路径,则可能应该使用GetDirectoryName等。@Marcelo不确定。我估计有700个用户,希望这是一个严重的高估,数千条记录将占用一兆字节左右。你是在严重受限的硬件上操作的吗?实际上,这要看情况而定。这是针对服务器应用程序的,每个连接到服务器的用户可能会导致内存中出现4000条记录。哦,这不是我的生产类,只是一个示例。现实生活中会有更多的文件路径。这是一个真实的文件路径,还是你只是这样命名的?如果是这样的话,它们是否只在实际文件名上有所不同,而您希望分割出路径?如果这是任务路径,则可能应该使用GetDirectoryName等。@Marcelo不确定。我估计有700个用户,希望这是一个严重的高估。很好,我会添加一个检查,以确保您不会超过最短字符串的长度。例如c:\1.jpg和c:\1.jpg.jpg将出错。编辑,就像那样很好,我会添加一个检查,以确保您不会超过最短字符串的长度。例如c:\1.jpg和c:\1.jpg.jpg将出错。编辑,就像那样