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

时间:2015-11-19 17:23:24

标签: c#

所有相关代码都在下面并且工作正常,我无法弄清楚为什么我的搜索方法只与列表中的前三个联系人一起使用。 "玛丽" "卡西迪"以及任何无法找到的联系方式。

任何建议都将不胜感激!

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

4 个答案:

答案 0 :(得分:5)

这是因为您有重复的区号条目。假设您正在搜索区号为“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
    }
}

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

让我们尝试寻找Mary Cassidy,其区号为"085",数字为"1111111"

  • 您在列表中搜索第一次出现的"085"。你找到了Bill Murray的索引。
  • 您在列表中搜索第一次出现的"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";

答案 3 :(得分:0)

考虑搜索此记录:

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

您可以这样调用方法:

search("085", "1111111")

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

然后评估为false

if (destAreaIndex == destNumIndex)

所以找不到匹配。

为什么不找到您正在寻找的 one 记录,而不是找到两个单独的记录?:

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

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

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