c#正则表达式给出错误

问题描述:

我正在使用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

如果没有匹配,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