根据文件夹结构对 url 字符串列表进行分组
本文关键字:列表 字符串 url 文件夹 结构 | 更新日期: 2023-09-27 18:30:27
我有一个网址列表(存储在我的数据库中)以及"总访问次数"值;我想以某种方式按文件夹对所有页面进行分组,然后将该文件夹的总页面访问量相加。例如,这是我的源数据:
/home 100
/products/ice-cream 150
/products/chocolate 50
/products/pancakes 20
/about/ 80
/contact/ 50
这是我的预期结果:
/home 100
/products/ 220
/about/ 80
/contact/ 50
有人对我如何实现这一目标有任何建议吗?
这是我到目前为止的代码,它只是呈现了访问次数旁边的 url:
var Items = new List<dynamic>();
ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["MyConnectionString"];
using (MySqlConnection con = new MySqlConnection(cs.ToString()))
{
string sql = "SELECT url, visits FROM url";
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Items.Add(new
{
Url = reader["url"],
Visits = reader["visits"],
});
}
}
con.Close();
}
if(Items.Count > 0)
{
<ul>
@foreach(var item in Items)
{
<li>@item.Url: @item.Visits</li>
}
</ul>
}
下面是
使用 Linq GroupBy 的解决方案:
var folderVisits = items.GroupBy(x => x.Url.Substring(0, x.Url.Remove(0, 1).IndexOf('/')))
.Select(x=> new { Folder = x.Key, TotalVisits = x.Sum(y => y.Visits)});
不过,您必须添加一个/
才能/home
才能正常工作。
您可以有一个将目录映射到其访问的Dictionary<string,int>
。
然后,您可以添加它们:
private Dictionary<string,int> dictionary;
//... (Remember to initialize the dictionary!)
private void AddVisits(string directory, int visits) {
string[] segments = Regex.Split("(''|'/)+", directory);
string topLevelDir = (directory.StartsWith("/") || directory.StartsWith("''")) ?
segments[1] :
segments[0];
topLevelDir = "/" + topLevelDir;
int newVisits = visits;
if(dictionary.ContainsKey(topLevelDir))
newVisits += dictionary[topLevelDir];
dictionary[topLevelDir] = newVisits;
}
注意:我是即时制作的。它可能有运行时错误,因此请随时评论您遇到的任何问题
我推荐的代码:
var folderVisits = items.GroupBy(i => new String(i.Url.TrimStart('/').TakeWhile(c => c != '/').ToArray()), StringComparer.CurrentCultureIgnoreCase)
.Select(grp => new {Folder = grp.Key, Visits = grp.Sum(_ => _.Visits)})
.ToArray();