c#Regex谓词给出错误
我正在使用c#Regex谓词给出错误,c#,regex,C#,Regex,我正在使用regex代码在我的windows phone应用程序中查找联系人匹配项,它工作正常,但有时会出现错误“值不能为null” 试试看{ var l=新列表(); foreach(listobj中的var项) l、 添加(项目名称); var digitMap=新字典(){ { 1, "" }, {2,“[abcABC]”, {3,“[defDEF]”}, {4,“[ghiGHI]”, {5,“[jklJKL]”}, {6,“[mnoMNO]”, {7,“[pqrsPQRS]”, {8,“
regex
代码在我的windows phone应用程序中查找联系人匹配项,它工作正常,但有时会出现错误“值不能为null”
试试看{
var l=新列表();
foreach(listobj中的var项)
l、 添加(项目名称);
var digitMap=新字典(){
{ 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(charsAsInts中的var val)
Append(digitMap[val]);
var pattern=regexBuilder.ToString();
//在正则表达式的末尾添加“*”,使其成为“StartsWith”,以“EndsWith”开头,或同时为“Contains”添加“*”;
pattern=“.*”+pattern+“*”;
var matchingNames=l.Where(x=>Regex.IsMatch(x,pattern));
SearchListbox.ItemsSource=listobj.FindAll(x=>x.phoneNumber.Contains(str)| x.FirstName.Contains(matchingNames.FirstOrDefault());
}捕获(例外e){
MessageBox.Show(e.Message);
}
我认为当没有联系人匹配时,它会抛出一个错误,并且它不会显示所有匹配,直到,全名匹配
怎么了?谢谢。当没有匹配项时,matchingNames为null,然后matchingNames.FirstOrDefault()也为null 所以这里您正在执行String.Contains(null)=>Exception 看到了吗?诸如此类:
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()));
}
对于第二个问题,请尝试完全删除匹配名称和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);
}
试试看{
var digitMap=新字典(){
{ 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(charsAsInts中的var val)
Append(digitMap[val]);
var pattern=regexBuilder.ToString();
//在正则表达式的末尾添加“*”,使其成为“StartsWith”,以“EndsWith”开头,或同时为“Contains”添加“*”;
pattern=“.*”+pattern+“*”;
SearchListbox.ItemsSource=listobj.FindAll(x=>x.PhoneNumbers.Contains(str)| Regex.isMatch(x.FirstName,pattern));
}捕获(例外e){
MessageBox.Show(e.Message);
}
你能先告诉我你到底想做什么吗?这在我看来非常复杂,因为有些东西应该是简单的哪一行抛出异常?请说明您建议如何解决该问题。这还不是问题的答案。@Benji_9989解决了我所有的问题:)谢谢
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);
}