2014-09-05 20 views
1

我正在研究一個撥號程序,我想在用戶按鍵時搜索聯繫人。我想搜索匹配電話號碼以及聯繫人姓名的聯繫人。我已經實現了根據電話號碼搜索聯繫人的方法,當用戶按下按鍵時,它將搜索與按下按鍵相似的號碼。在手機鍵盤上查找字母組合

我的代碼是:

List<string> a = new List<string>(); 
var alphabet = "abc"; 
var al2 = "def"; 

var q = alphabet.Select(x => x.ToString()); 
int size = 3; 
for (int i = 0; i < size - 1; i++) 
    q = q.SelectMany(x => al2, (x, y) => x + y); 

foreach (var item in q) 
    a.Add(item); 

SearchListbox.ItemsSource = listobj 
    .FindAll(x => x.Phone.Contains(str) || 
     x.FirstName.Contains(a.Any().ToString())); 

它完全適用於數字搜索,但不是名稱搜索。

我想在用戶按鍵時搜索與字母組合匹配的聯繫人。我怎麼做?我正在爲Windows Phone構建一個應用程序,因此它必須位於c#中。

+1

所有發佈的內容都是程序說明。但是,我們需要您[提出問題](http://stackoverflow.com/help/how-to-ask)。我們無法確定您想從我們這裏得到什麼。請編輯您的帖子以包含我們可以回答的有效問題。提醒:請確保你知道[這裏的主題是什麼](http://stackoverflow.com/help/on-topic),要求我們爲你編寫程序,而且建議不在話下。 – gunr2171 2014-09-05 18:21:14

+0

@ gunr2171編輯! – 2014-09-05 18:27:01

+1

我仍不明白你所顯示的代碼「不起作用」。你能詳細說明嗎? – gunr2171 2014-09-05 18:30:03

回答

1

這是正則表達式的好工作!這是我颳起了使用正則表達式進行搜索的例子:

 var names = new List<string>(); 
     names.Add("alice"); 
     names.Add("bob"); 
     names.Add("charlie"); 

     var digitMap = new Dictionary<int, string>() 
     { 
      { 1, "" }, 
      { 2, "[abcABC]" }, 
      { 3, "[defDEF]" }, 
      { 4, "[ghiGHI]" }, 
      { 5, "[jklJKL]" }, 
      { 6, "[mnoMNO]" }, 
      { 7, "[pqrsPQRS]" }, 
      { 8, "[tuvTUV]" }, 
      { 9, "[qxyzQXYZ]" }, 
      { 0, "" }, 
     }; 

     var enteredDigits = "26"; 
     var charsAsInts = enteredDigits.ToCharArray().Select(x => int.Parse(x.ToString())); 

     var regexBuilder = new StringBuilder(); 
     foreach (var val in charsAsInts) 
      regexBuilder.Append(digitMap[val]); 

     var pattern = regexBuilder.ToString(); 

     //append a ".*" to the end of the regex to make it "StartsWith", beginning for "EndsWith", or both for "Contains"; 
     pattern = ".*" + pattern + ".*"; 

     var matchingNames = names.Where(x => Regex.IsMatch(x, pattern)); 

     Console.WriteLine("Matching input: " + enteredDigits + " as regex: " + pattern); 

     foreach (var n in matchingNames) 
      Console.WriteLine(n); 

在這個例子中,我有「26」作爲輸入,過濾掉所有,但「鮑勃」。如果你刪除了6,你會發現它將返回全部三個,因爲它們的名字都有a,b或c。如果您希望它與數字匹配,只需將該數字添加到字典中的正則表達式字符串值即可。

+0

你真棒!多數民衆贊成在我正在尋找:) – 2014-09-19 18:23:17

+0

其工作正常,但我認爲它不搜索所有的比賽。 – 2014-09-19 19:11:39

+0

你是什麼意思?舉一個例子 – DLeh 2014-09-19 19:39:03

0

我對Windows Phone開發不是很熟悉,但我知道Windows Phone SDK中包含聯繫人搜索功能。

您是否嘗試過查看Contacts類的SearchAsyc方法?

它可能不適用於此類型的搜索,但它似乎是一種常見的手機聯繫人搜索類型。

如果這是不可能的,我會說DLeh的解決方案將運作良好。