⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queryresults.cs

📁 用C#编写的一个款搜索engine的源代码!摘自<Visual c#2005 程序设计>
💻 CS
字号:
using System;

namespace SECompare.Structure
{
	/// <summary>
	/// Class QueryResults represents all the results generated from a certain query and search engine.
	/// </summary>
	public class QueryResults
	{
		private String mQuery;
		private String mEngine;
		private int mMaxLength;   //max length of results list
		private bool[] mFlags;    //if the record ranked at i exists, mFlags[i]=true,.

		public int Count
		{
			get
			{
				return QueryResults.GetMaxRank(this.mQuery,this.mEngine);
			}
		}

		/// <summary>
		/// Constructor.
		/// </summary>
		/// <param name="query">Query words</param>
		/// <param name="engine">Search engine name</param>
		/// <param name="maxLength">Max length of results, for example 1000.</param>
		public QueryResults(String query,String engine,int maxLength)
		{
			this.mQuery     = query;
			this.mEngine    = engine;
			this.mMaxLength = maxLength;
			this.mFlags     = new bool[this.mMaxLength+1];
			this.RefreshFlags();
		}

		public QueryResults(String query,EngineSet engine,int maxLength)
		{
			this.mQuery     = query;
			this.mEngine    = EngineSetting.GetName(engine);
			this.mMaxLength = maxLength;
			this.mFlags     = new bool[this.mMaxLength+1];
			this.RefreshFlags();
		}

		public void RefreshFlags()
		{
			int maxRank = QueryResults.GetMaxRank(this.mQuery,this.mEngine);
			int i;
			for(i=1;i<=maxRank;i++)
			{
				this.mFlags[i]=true;
			}
			for(;i<=this.mMaxLength;i++)
			{
				this.mFlags[i]=false;
			}
		}

		/// <summary>
		/// Get next query range.
		/// </summary>
		/// <param name="start">the start rank of range to query</param>
		/// <param name="length">the length of range</param>
		/// <returns>true if there is some results haven't gotten yet, else false</returns>
		public bool GetNextQueryRange(out int start,out int length)
		{
			start  = 0;
			length = 0;
			int maxLength = EngineSetting.GetRecordPerQuery( EngineSetting.GetEnum(this.mEngine) );
			for(int i=1;i<this.mMaxLength;i++)
			{
				int j;
				for(j=0;j<maxLength;j++)
				{
					if((i+j)>this.mMaxLength)
					{
						//to the end of the list
						start = i;
						length = j;
						return true;
					}
					if(this.mFlags[i+j]==true) break;
				}
				if(j==maxLength)
				{
					start = i;
					length = maxLength;
					return true;
				}
			}
			return false;
		}

		/// <summary>
		/// Get Max Rank of given query, using binary search.
		/// </summary>
		/// <param name="Query">Query Words</param>
		/// <param name="EngineName">Engine Name</param>
		/// <returns>Max Rank Number</returns>
		public static int GetMaxRank(String Query,String EngineName)
		{
			if(!QueryRecord.Exists(Query,EngineName,1))
				return 0;
			if(QueryRecord.Exists(Query,EngineName,1000))
				return 1000;

			int low = 1, high = 1000, rank;

			while(low<high)
			{
				rank = (low+high)/2;

				//Return case:
				if(QueryRecord.Exists(Query,EngineName,rank)
					&&!QueryRecord.Exists(Query,EngineName,rank+1))
					return rank;
				if(QueryRecord.Exists(Query,EngineName,rank-1)
					&&!QueryRecord.Exists(Query,EngineName,rank))
					return rank-1;

				//Scale down the range
				//low is forever exist
				if(QueryRecord.Exists(Query,EngineName,rank))
					low  = rank+1;
				//high is forever not exist
				if(!QueryRecord.Exists(Query,EngineName,rank))
					high = rank-1;
			}

			return -1;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -