2014-10-09 140 views
0

我正在使用regex代碼來查找我的windows phone應用程序中的聯繫人匹配,它工作良好,但有時會出錯"Values cannot be null"c#正則表達式給出錯誤

try { 
    var l = new List<string>(); 
    foreach (var item in listobj) 
    l.Add(item.FirstName); 

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

    var enteredDigits = str; 
    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 = l.Where(x => Regex.IsMatch(x, pattern)); 
    SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | x.FirstName.Contains(matchingNames.FirstOrDefault())); 

} catch (Exception e) { 
    MessageBox.Show(e.Message); 
} 

我想當沒有接觸匹配時會拋出一個錯誤,它也不會顯示所有的匹配,直到整個名字匹配。

怎麼了?謝謝。

+0

你能告訴我第一取悅你有什麼actualy想幹什麼?這看起來很複雜,對我來說應該很簡單 – Vajura 2014-10-09 09:40:44

+0

哪一行會引發異常? – 2014-10-09 09:42:00

回答

1

如果沒有匹配,matchingNames爲null,則matchingNames.FirstOrDefault()也爲空

所以在這裏找你做String.Contains(空)=>異常

你看到了什麼?類似的東西:

if (matchingNames == null)  
{  
    //Search just in phoneNumbers  
    SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str));  
}  
else  
{  
    //Search both  
    SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | x.FirstName.Contains(matchingNames.FirstOrDefault()));  
} 

你的第二個問題,嘗試將其完全刪除matchingNames和L變量:

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

    var enteredDigits = str; 
    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 + ".*"; 

    SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | Regex.isMatch(x.FirstName, pattern)); 

} catch (Exception e) { 
    MessageBox.Show(e.Message); 
} 
+0

請說明你建議解決這個問題。這不是問題的答案。 – kkuilla 2014-10-09 09:50:42

+0

@ Benji_9989解決了我所有的問題:)謝謝 – 2014-10-09 10:37:18