简单的测试了一下IE前进和后退的过程.
依次访问网站A,B,C,D.
后退至 B,
然后重新请求网站E,
则记录的保存顺序则是 A,B,E
C,D将会从记录列表中删除.
下面看代码(以下操作均在内存中进行):
一个History对象,用来生成一个记录对象,该对象包含 url,title,html三个属性.

Code
class History

{
private string Title_ = "";
private string WmlSource_ = "";
private string Url_ = "";
public string Title

{

get
{ return Title_; }

set
{ Title_ = value; }
}
public string WmlSource

{

get
{ return WmlSource_; }

set
{ WmlSource_ = value; }
}
public string Url

{

get
{ return Url_; }

set
{ Url_ = value; }
}
public History()

{

}
public History(string t, string w, string u)

{
Title_ = t;
WmlSource_ = w;
Url_ = u;
}
}
HistoryAction是对链表操作静态类,具体看代码注释

Code
class HistoryAction

{
//活动节点对象,即当前的节点对象
private static LinkedListNode<History> HistoryCurrentNode= null;
//全局的链表对象,所以记录均保存到该对象中
private static LinkedList<History> HistoryList = new LinkedList<History>();
//设置保存最大条数,当达到该条数时,每次增加记录时,均依次删除原有记录
private static int MaxList = 10;

/**//// <summary>
/// 或取当前的记录信息
/// </summary>
public static History CurrentHistory

{

get
{ return (History)HistoryCurrentNode.Value; }
}

/**//// <summary>
/// 当前后退时否可用,用于设置按钮状态信息
/// </summary>
public static bool IsBack

{
get

{
return HistoryCurrentNode.Next == null ? false : true;
}
}

/**//// <summary>
/// 当前前进时否可用,用于设置按钮状态信息
/// </summary>
public static bool IsGo

{
get

{
return HistoryCurrentNode.Previous == null ? false : true;
}
}

/**//// <summary>
/// 向历史记录链表中加入新的节点
/// </summary>
/// <param name="h"></param>
public static void Add(History h)

{
LinkedListNode<History> tem = HistoryList.First;
//如果连续加入url相同的记录,则只加入一次,可以根据自已情况设置
if (tem!=null && ((History)tem.Value).Url.ToLower() == h.Url.ToLower())

{
return;
}

//当当前节点不为空,或该节点的上一个节点也不为空时,则删除该节点的前所有节点(模拟IE)
//模拟IE对前进后退的处理
if (HistoryCurrentNode != null && HistoryCurrentNode.Previous != null)

{
DelNode(HistoryCurrentNode);
}

//处理限制最大记录条数
if (MaxList > 0)

{
if (HistoryList.Count + 1 > MaxList)

{
HistoryList.RemoveLast();
}
}
HistoryCurrentNode = new LinkedListNode<History>(h);
HistoryList.AddFirst(HistoryCurrentNode);
}

/**//// <summary>
/// 后退
/// </summary>
public static void Back()

{
HistoryCurrentNode = HistoryCurrentNode.Next;
}

/**//// <summary>
/// 前进
/// </summary>
public static void Go()

{
HistoryCurrentNode = HistoryCurrentNode.Previous;
}

/**//// <summary>
/// 删除指定节点前所有节点
/// </summary>
/// <param name="node"></param>
private static void DelNode(LinkedListNode<History> node)

{
while (node.Previous != null)

{
HistoryList.Remove(node.Previous);
}
}
}
页面调用方法

Code
private void AddHistory(string title, string wmlsource, string url) //将记录加到列表中
{
History h = new History();
h.Title = title;
h.WmlSource = wmlsource;
h.Url = url;
HistoryAction.Add(h);
RefurbishGoBackButton(); //刷新按钮状态.由自已定义
}
private void Back() //后退
{
HistoryAction.Back();
History h = HistoryAction.CurrentHistory; //获取后退后的History对象
LoadHistory(h); //处理该对象,由自已定义.
RefurbishGoBackButton();//刷新按钮状态.由自已定义
}
private void Go() //前进
{
HistoryAction.Go();
History h = HistoryAction.CurrentHistory;
LoadHistory(h); //处理该对象,由自已定义.
RefurbishGoBackButton();//刷新按钮状态.由自已定义
}
OK,搞定,实际上非常简单,这里可以看到LinkedList的方便之处了.对性能的处理请自已把握.
好了,如果有不合理的地方请大家指正.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述