为什么当我使用下面的搜索方法时,它只适用于我列表中的前三个联系人

本文关键字:列表 适用于 联系人 三个 搜索 为什么 方法 | 更新日期: 2023-09-27 18:23:41

所有相关代码都在下面,运行良好,但我不明白为什么我的搜索方法只适用于列表中的前三个联系人。"玛丽"卡西迪"和下面的任何联系人都找不到。

任何建议都将不胜感激!

namespace SmsApp.Models
{
    public class Contacts
    {
        public List<Friend> contacts = new List<Friend>()
        {    
            new Friend("Alan", "Peck", "087", "4138776"),
            new Friend("Bill", "Murray", "085", "6542777"),
            new Friend("Jim", "Beglin", "086", "7865392"),
            new Friend("Marie", "Cassidy", "085", "1111111"),
            new Friend("Shane", "Flynn", "089", "2345634"),
            new Friend("Tom", "Murray", "087", "9876543"),
            new Friend("Jeff", "Banks", "087", "6372876"),
            new Friend("Richie", "Towell", "085", "0098765"),
            new Friend("Niall", "Doyle", "087", "0009876"),
            new Friend("Sarah", "Lambe", "085", "2238765")
        };
        //This method searches through the 'contacts' List for a match
        public String search(string destAreaCode, string destNumber)
        {
            //looks for input parameter matching item within the List of Person objects 
            int destAreaIndex = contacts.FindIndex(x => x.destArea == destAreaCode);
            //looks for input parameter matching item within the List of Person objects 
            int destNumIndex = contacts.FindIndex(x => x.destNum == destNumber);
            if (destAreaIndex == destNumIndex)
                //this return value string is passed to the 'Success' View, which displays it to the user 
                return "Your message was sent to " + contacts.ElementAt(destAreaIndex).foreName + " " + contacts.ElementAt(destAreaIndex).surName;
            //this return value is used within an if statement to redirect user to the 'Error' View / User does not see the content of this string
            else return "nomatch";    
        }    
    }
}

为什么当我使用下面的搜索方法时,它只适用于我列表中的前三个联系人

这是因为您有重复的区号条目。假设您正在搜索一个区号为"085"的朋友。FindIndex将始终返回它找到的第一个项目。

你的搜索功能应该是这样的:

public String search(string destAreaCode, string destNumber)
{
    var friend = contacts.FistOrDefault(x=>x.destArea == destAreaCode && x.destNum ==destAreaCode);
    if (friend != null)
    {
        //do some stuff
    } else 
    {
        //do something else
    }
}

让我们试着找到Mary Cassidy,她的区号是"085",号码是"1111111"

  • 您在列表中搜索第一个出现的"085"。你可以找到比尔·默里的索引
  • 您在列表中搜索第一次出现的"1111111"。你可以找到玛丽·卡西迪的索引
  • 检查两个指数是否相等。他们不是。没有匹配

相反,您应该找到第一个同时匹配这两个条件的事件。

var contact = contacts.FirstOrDefault(x => x.destArea == destAreaCode 
                                        && x.destNum == destNumber);

我们使用FirstOrDefault是因为可能没有匹配,并且我们不想在没有匹配时抛出异常。现在我们只需要检查null来决定是否存在匹配。

if (contact != null)
    return "Your message was sent to " + contact.foreName + " " + contact.surName;
return "nomatch";

列表中有多个项目具有相同的区号。因此,当您搜索特定的区号时,它会返回与该区号匹配的第一个项目,尽管您可能希望在列表中找到下一个项目。

对此的解决方案是,对于以下两种组合条件,仅使用FindIndex一次:

int index = contacts.FindIndex(x => x.destArea == destAreaCode && x => x.destNum == destNumber);

请注意,在这种情况下,您需要检查index是否等于-1,以检测是否没有匹配项。

考虑搜索此记录:

new Friend("Marie", "Cassidy", "085", "1111111")

您可以这样调用该方法:

search("085", "1111111")

在该方法中,对FindIndex()的第一个调用将返回1,因为这是第一个匹配的记录。您对FindIndex()的第二次调用将返回3,因为这是第一个匹配的记录。

然后评估为false:

if (destAreaIndex == destNumIndex)

所以没有找到匹配项。


与其找到两个单独的记录,为什么不直接找到您要查找的一个记录呢?:

var match = contacts.SingleOrDefault(c => c.destArea == destAreaCode && c.destNum == destNumber);

如果matchnull,则未找到任何记录。如果它有一个值,那就是匹配的记录,可以使用:

return "Your message was sent to " + match.foreName + " " + match.surName;