假设有一个表,其中混合了国家、城市、子城市等数据。示例:
Name | id | parent_id
1) united kingdom | 1 | 0;
2) london | 2 | 1;
3) south london | 3 | 2;
我从表中获取数据,需要为每个城市创建一个 URL,例如伦敦南部:
/united-kingdom/london/south-london
如何从此类传入数据创建这样的层次结构?
var geoSolution = await _geoService.GetGeoChildren(selectedCountry, culture, cancellationToken);
foreach (var geo in geoSolution.Value ?? Enumerable.Empty<Geo>())
{
if (geo.ParentId == null) continue;
sitemapList.Add(new SitemapHtml(geo.GeoName ?? string.Empty, GetPrefix(geo.Name ?? string.Empty, product ?? ""))
{
Links = await GetSitemapLinksForGeo(urlSections, geo, cancellationToken, true)
});
}
return sitemapList.OrderBy(x => x.Name).ToList();
geoSolution 返回这些对象的列表,每个对象都有 id 和parentId,如果其国家=>parentId == null
您绑定到不稳定的数据类型。 伦敦是一个地名(Toponym),可以任意改变,伦敦作为地名可以有翻译,等等。
如果您有地理位置,这些是坐标或一些编码坐标系。 在这些系统中已经存在(以某种方式编码的)伦敦。
编码系统的要求
主要的编码系统是建立在象限上的——这是一种只用(!)一个数字来表示(编码)地球的编码系统,并且通常这个数字不会超过ulong类型。
A 象限是 4 个正方形,编码为 00、01、10、11,但是这 4 个相对于自身的正方形中的每一个都可以由更小的 4 个正方形(即 16 个正方形)编码为
00 = (0000, 0001, 0010, 0011)
01 = (0100, 0101, 0110, 0111)
10 = (1000, 1001, 1010, 1011)
11 = (1100, 1101, 1110, 1111)
..等等 - 它产生一个由一个数字编码的二维空间。
这个二维空间是一个球体,但是它被拉伸成一个圆柱体,圆柱体被扩展成一个有限的平面——这就是地球的地图,而这张地球的地图是被编码的(例如)按象限。
但是英格兰在这个系统中是用一个数字编码的,并且这个数字与象限编码中的数字相同,例如010111 - 而且这个数字是唯一的并且很小。
但是
英格兰中包含的所有内容都是这个数字的派生,即英格兰中的所有内容都以数字010111开头,例如苏塞克斯郡在地理上位于某个地方,但它属于英格兰,它比英格兰小,例如,这是数字 (010111)110011,其中括号内是英格兰,不在括号内是苏塞克斯。
(010111) England
(010111)110011 Sussex
但是你可以安排象限的算术,实际上非常快速地确定一个对象对另一个对象的归属,排序,搜索等等。
您正在与地理系统通信,但这些系统已经有了实现,并且这些系统已经实现了您需要的层次结构。
https://en.wikipedia.org/wiki/Toponymy https://en.wikipedia.org/wiki/Quadtree