首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据两个部分Uri和一个假设反向计算Url /Uri

如何根据两个部分Uri和一个假设反向计算Url /Uri
EN

Stack Overflow用户
提问于 2014-02-27 23:47:58
回答 1查看 73关注 0票数 1

我在数据库字段中存储了一个相对路径。它看起来是这样的:

代码语言:javascript
复制
/images/2012-6/file.jpg

我可以通过以下方式访问绝对Url:

代码语言:javascript
复制
http://www.blah.com/images/2012-6/file.jpg

缩略图相对路径未存储在数据库表中。然而,我知道它可以在以下位置找到:

代码语言:javascript
复制
http://www.blah.com/images/thumbnails/2012-6/file.jpg

假设我知道http://www.blah.com//images/2012-6/file.jpg,那么确定以下内容的最佳算法是什么:

代码语言:javascript
复制
http://www.blah.com/images/thumbnails/2012-6/file.jpg

注意:命名方案可以是相对路径和缩略图文件夹根路径上的多个文件夹。即/images/whatever/something/thumbnails/"

您可以做的一个也是唯一的假设是,两者都将从相同的第一个段(文件夹)开始。即/images/

这是在一个控制台应用程序中(如果我可以的话没有System.Web )。这是到目前为止的the best I have come up

代码语言:javascript
复制
public static void Main()
{
    var test = GetThumbnail("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/");
    Console.WriteLine(test);
}

private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
{
    var root = new Uri(baseUriString, UriKind.Absolute);
    var absolute = new Uri(root, relativePath);
    var segments = absolute.Segments;

    var thumbnailUri = new Uri(root, thumbsPath);
    var thumbSegments = thumbnailUri.Segments;

    var matchedRoot = Array.IndexOf(segments, thumbSegments[1]);

    var builder = new UriBuilder(root);

    for (var j = 1; j < segments.Length; j++)
    {
        if (j == matchedRoot)
        {
            for (var k = 1; k < thumbSegments.Length; k++)
            {
                builder.Path += thumbSegments[k];
            }
        }
        else
        {
            builder.Path += segments[j];
        }
    }

    return builder.Uri.ToString();
}

这似乎令人费解。有没有更好的方法呢?

EN

回答 1

Stack Overflow用户

发布于 2014-02-28 03:22:08

如果我正确地理解了您的需求,您基本上想要:

找到重叠的第一个片段

  1. 将所有的拇指片段插入到Uri中的那个点。

您的代码已经做到了这一点,但我相信下面的代码会让这些步骤变得更加清晰:

代码语言:javascript
复制
    private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
    {
        // 1. Break the paths into segments
        // the trim here is important to prevent empty list items or "//" when we rebuild later.
        List<string> relativeSegments = relativePath.Trim('/').Split('/').ToList();
        List<string> thumbsSegments = thumbsPath.Trim('/').Split('/').ToList();

        // 2. Find the first segment of thumbs in the relative segments
        int sharedSegmentIndex = relativeSegments.IndexOf(thumbsSegments[0]);

        // 3. Insert all the thumbs segments into that spot in the Uri.
        // remove the overlapping segment (because we're adding it again below)
        relativeSegments.RemoveAt(sharedSegmentIndex);
        // insert the thumbs segment
        relativeSegments.InsertRange(sharedSegmentIndex, thumbsSegments);

        // build up the full path.
        var root = new Uri(baseUriString, UriKind.Absolute);
        var builder = new UriBuilder(root);
        builder.Path += string.Join("/", relativeSegments);

        return builder.Uri.ToString();
    }

此外,这里是我的快速和肮脏的测试套件,所以你可以检查我做出了正确的期望输出,以及任何其他想要修补的人。

代码语言:javascript
复制
    public static void Main()
    {
        RunTest("http://www.blah.com/", "/images/2012-6/file.jpg", "/images/thumbnails/", "http://www.blah.com/images/thumbnails/2012-6/file.jpg");
        RunTest("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
        RunTest("http://www.blah.com/", "/myapp/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/myapp/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
    }

    public static void RunTest(string baseUriString, string relativePath, string thumbsPath, string expected)
    {
        var result = GetThumbnail(baseUriString, relativePath, thumbsPath);
        Debug.Assert(result == expected);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22073454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档