2012-03-18 79 views
2

想知道我是否可以加快搜索速度。 我需要建立一個有很多用戶界面屏幕 的一個我有作品被使用的功能,但我需要確保我實現了快速algoritim如果你喜歡加速搜索.net 4.0

這就像一個漸進式搜索。

用戶類型搜索例如

 const string searchFor = "Guinea"; 
     const char nextLetter = ' ' 

它會在列表中的單詞,並返回2個記錄

 "Guinea and Guinea Bissau " 

用戶鍵入一個詞來搜索如

 const string searchFor = "Gu"; 
     const char nextLetter = 'i' 

    returns 
    3 results. 

這是功能,但我想加快速度。 這種搜索是否存在模式?

class Program 
{ 
    static void Main() 
    { 
     //Find all countries that begin with string + a possible letter added to it 
     //const string searchFor = "Guinea"; 
     //const char nextLetter = ' '; //returns 2 results 

     const string searchFor = "Gu"; 
     const char nextLetter = 'i'; 
     List<string> result = FindPossibleMatches(searchFor, nextLetter); 
     result.ForEach(x=>Console.WriteLine(x)); //returns 3 results 



     Console.Read(); 
    } 
    /// <summary> 
    /// Find all possible matches 
    /// </summary> 
    /// <param name="searchFor">string to search for</param> 
    /// <param name="nextLetter">pretend user as just typed a letter</param> 
    /// <returns></returns> 
    public static List<string> FindPossibleMatches (string searchFor, char nextLetter) 
    { 
     var hashedCountryList = new HashSet<string>(CountriesList()); 
     var result=new List<string>(); 

     IEnumerable<string> tempCountryList = hashedCountryList.Where(x => x.StartsWith(searchFor)); 

     foreach (string item in tempCountryList) 
     { 
      string tempSearchItem; 
      if (nextLetter == ' ') 
      { 
       tempSearchItem = searchFor; 
      } 
      else 
      { 
       tempSearchItem = searchFor + nextLetter; 
      } 
      if(item.StartsWith(tempSearchItem)) 
      { 
       result.Add(item); 
      } 

     } 
     return result; 
    } 



    /// <summary> 
    /// Returns list of countries. 
    /// </summary> 
    public static string[] CountriesList() 
    { 
     return new[] 
      { 
       "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
       "Angola", "Anguilla", "Antarctica", "Antigua And Barbuda", "Argentina", 
       "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", 
       "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", 
       "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", 
       "Bolivia", "Bosnia Hercegovina", "Botswana", "Bouvet Island", "Brazil", 
       "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi", "Byelorussian SSR", 
       "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands", 
       "Central African Republic", "Chad", "Chile", "China", "Christmas Island", 
       "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo", "Cook Islands", 
       "Costa Rica", "Cote D'Ivoire", "Croatia", "Cuba", "Cyprus", 
       "Czech Republic", "Czechoslovakia", "Denmark", "Djibouti", "Dominica", 
       "Dominican Republic", "East Timor", "Ecuador", "Egypt", "El Salvador", 
       "England", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia", 
       "Falkland Islands", "Faroe Islands", "Fiji", "Finland", "France", 
       "Gabon", "Gambia", "Georgia", "Germany", "Ghana", 
       "Gibraltar", "Great Britain", "Greece", "Greenland", "Grenada", 
       "Guadeloupe", "Guam", "Guatemela", "Guernsey", "Guiana", 
       "Guinea", "Guinea Bissau", "Guyana", "Haiti", "Heard Islands", 
       "Honduras", "Hong Kong", "Hungary", "Iceland", "India", 
       "Indonesia", "Iran", "Iraq", "Ireland", "Isle Of Man", 
       "Israel", "Italy", "Jamaica", "Japan", "Jersey", 
       "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea, South", 
       "Korea, North", "Kuwait", "Kyrgyzstan", "Lao People's Dem. Rep.", "Latvia", 
       "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", 
       "Lithuania", "Luxembourg", "Macau", "Macedonia", "Madagascar", 
       "Malawi", "Malaysia", "Maldives", "Mali", "Malta", 
       "Mariana Islands", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", 
       "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", 
       "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", 
       "Namibia", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", 
       "Neutral Zone", "New Caledonia", "New Zealand", "Nicaragua", "Niger", 
       "Nigeria", "Niue", "Norfolk Island", "Northern Ireland", "Norway", 
       "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", 
       "Paraguay", "Peru", "Philippines", "Pitcairn", "Poland", 
       "Polynesia", "Portugal", "Puerto Rico", "Qatar", "Reunion", 
       "Romania", "Russian Federation", "Rwanda", "Saint Helena", "Saint Kitts", 
       "Saint Lucia", "Saint Pierre", "Saint Vincent", "Samoa", "San Marino", 
       "Sao Tome and Principe", "Saudi Arabia", "Scotland", "Senegal", "Seychelles", 
       "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", 
       "Somalia", "South Africa", "South Georgia", "Spain", "Sri Lanka", 
       "Sudan", "Suriname", "Svalbard", "Swaziland", "Sweden", 
       "Switzerland", "Syrian Arab Republic", "Taiwan", "Tajikista", "Tanzania", 
       "Thailand", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", 
       "Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", 
       "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", 
       "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City State", "Venezuela", 
       "Vietnam", "Virgin Islands", "Wales", "Western Sahara", "Yemen", 
       "Yugoslavia", "Zaire", "Zambia", "Zimbabwe" 
      }; 
    } 
} 

}

有什麼建議? 謝謝

+0

在db中加載它並做一個類似的查詢? – WorldIsRound 2012-03-18 16:43:35

+0

需要在內存中做我沒有自己的數據庫 – user9969 2012-03-18 16:50:22

+0

nextLetter參數的邏輯目的是什麼? – msigman 2012-03-18 16:50:29

回答

2

是的,把所有這些放在數據庫中,並使用SQL查詢(最好使用LIKE子句)來完成這項工作。我這樣說的原因是,數據庫是設計做你想做的事情。信息存儲和檢索。

如果在您的要求下無法部署完整的SQL實例,您可以始終查看具有C#實現的SQLLite

+0

我不這麼認爲。處理內存中對象的速度應該比轉到外部位置(如數據庫)要快,其他條件都相同。 – msigman 2012-03-18 16:47:43

+0

@msigman,這取決於他得到了多少數據 – 2012-03-18 16:49:59

+0

@msigman,正如西蒙所說(ha!),這完全取決於數據集。我的建議是基於他想要搜索一堆事物的事實,也許我們需要評估這些數據是否需要放在* first *位置的「代碼」中。 – 2012-03-18 17:06:54

1

如果你的數據集是靜態的,我會考慮在一個有序數組上使用二分搜索來定位範圍的開始和結束。之間的一切都是你的結果。