Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#Regex谓词给出错误_C#_Regex - Fatal编程技术网

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);
}