是否有一种“简单的方法”来创建一个队列,在一段时间后它会出现问题? (C#)

时间:2018-05-02 01:51:46

标签: c# data-structures

我在这里遇到了一些问题,我想要一些帮助。

我的代码是在网页上无限搜索模式,无论何时找到新内容,它都会将其写入文件。

但是,有时候,我正在清理的信息已经在文件中,但它没有更新,我不想在我的文件上重复输入。

因此,我只是创建了一个字符串列表,在那里添加每个条目,每次代码找到它要查找的内容时,它会在写入文件之前检查字符串是否已经在该列表中。

你可以清楚地看到为什么这是一个坏主意......因为它全天候运行,这个列表将无休止地变得更大。但是有一个问题!我百分百肯定,如果15分钟过去,我正在寻找的信息将永远不会重复。

所以,我真正想要的是消除此列表中的项目15分钟。我无法想到这样做的简单和/或优雅。或者,我不知道是否有一些数据结构或库可以解决这个问题。

这就是我在这里问的原因:什么是创建某种“定时列表”的最佳解决方案,其中有一段时间的项目会在迭代结束时被删除?

提前致谢。

4 个答案:

答案 0 :(得分:2)

您是否尝试过.NET的内置MemoryCache

您可以设置包含绝对超时的缓存策略,我认为这是您想要的。

答案 1 :(得分:0)

这是你想要的吗?

List with timeout/expire ability

通过关键字在谷歌上找到它:" C#时间列表"

答案 2 :(得分:0)

你需要运行一些定期修剪列表的东西。

我过去所做的是:

  1. 使用@Override public void onPause() { super.onPause(); LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver (qReciever); } 代替ConcurrentBag<Tuple<DateTime, T>>
  2. 使用Tuples包,存储对象及其添加时间:List<T>
  3. 运行定期枚举行李的辅助线程,并删除所有已“过期”的条目。
  4. 这是一种更积极的方法,但它非常简单。但是,由于您现在正在使用两个线程,因此必须小心不要死锁。这就是为什么我使用像theBag.Add(Tuple.Create(DateTime.Now, myObject));这样的东西。您还可以查看其他ConcurrentBag个集合。您提到了一个队列,因此您可以尝试Concurrent

    像其他人建议的那样,仔细查看缓存库并权衡您的选择。完整的缓存库可能过度。

答案 3 :(得分:0)

创建一个具有字符串属性和timestamp属性的类,而不是字符串列表。创建类的实例时,使用DateTime.Now自动填充timestamp属性。

每次迭代列表以查看字符串是否存在时,请检查时间戳属性并丢弃超过15分钟的任何项目。

例如

class TimeStampedSearchResult
{
    public string SearchResult { get; set; }

    public DateTime TimeStamp { get; private set; }

    public TimeStampedSearchResult(string searchResult)
    {
        SearchResult = searchResult;
        TimeStamp = DateTime.Now;
    }

    public void UpdateTimeStamp()
    {
        TimeStamp = DateTime.Now;
    }
}

然后你就可以使用它:

public SearchForever()
{
    //the results list
    List<TimeStampedSearchResult> results = new List<TimeStampedSearchResult>();
    //a list of expired results to remove from results list
    List<TimeStampedSearchResult> expiredResults = new List<TimeStampedSearchResult>();
    while (true)
    {
        //search for a result
        var searchResult = new TimeStampedSearchResult(SearchForStuff());
        bool found = false;
        //iterate our list
        foreach (var result in results)
        {
            if (result.SearchResult == searchResult.SearchResult)
            {
                result.UpdateTimeStamp();
                found = true;
            }
            else
            {
                if (result.TimeStamp < DateTime.Now.AddMinutes(-15))
                {
                    expiredResults.Add(result);
                }
            }
        }
        if (!found)
        {
            //add to our results list
            results.Add(searchResult);
            //write result to file
            WriteResult(searchResult.SearchResult, "myfile.txt")
        }

        //remove expired results
        foreach (var oldResult in expiredResults)
            results.Remove(oldResult);

        //make sure you clear the expired results list too.
        expiredResults.Clear();
    }
}