从列表中删除用户选择的项目

5
我正在尝试使用列表在控制台应用程序中构建一个联系人管理器程序,以存储和显示数据。我需要查看一个报告,显示可用联系人的摘要,然后有一个菜单让用户与程序交互。我有一个创建联系人和联系人对象的方法。我也有一个删除联系人的方法,但我希望用户能够选择一个联系人名称并能够删除所选的联系人。然而,我不确定如何做到这一点。
如果您有任何指导,将不胜感激。
    static void Main(string[] args)
        {         
            //Declare the list

            List<Contact> contactList = new List<Contact>();

            //Main Driver
            char menuItem;
             Console.WriteLine("Contact List\n");
            menuItem = GetMenuItem();
            while (menuItem != 'Q')
            {

                ProcessMenuItem(menuItem, contactList);
                menuItem = GetMenuItem();

            }
            Console.WriteLine("\nThank you, goodbye");
            Console.ReadLine();
        }
        //Returns either a 'C', 'R', 'U', 'D', 'L', or 'X' to the caller
        static char GetMenuItem()
        {
            char menuItem;
            DisplayMenu();
            menuItem = char.ToUpper(IOConsole.GetChar("\nPlease pick an item: "));
            while (menuItem != 'C'
                && menuItem != 'R' && menuItem != 'Q' && menuItem != 'U' && menuItem != 'D' && menuItem != 'S' && menuItem != 'L' && menuItem != 'F' && menuItem != 'P' && menuItem != 'T')
            {
                Console.WriteLine("\nError - Invalid menu item");
                DisplayMenu();
                menuItem = char.ToUpper(IOConsole.GetChar("\nEnter option or M for menu:"));
            }
            return menuItem;
        }

        static void DisplayMenu()
        {
           Console.WriteLine("C-> Create Contacts");
           Console.WriteLine("R-> Remove Contacts");
           Console.WriteLine("U-> Update Contacts");
           Console.WriteLine("D -> Load data from file");
           Console.WriteLine("S-> Save data to file");
           Console.WriteLine("L-> View sorted by last name");
           Console.WriteLine("F-> View sorted by first name");
           Console.WriteLine("P-> View by partial name search");
           Console.WriteLine("T-> View by contact type");
           Console.WriteLine("Q-> Quit");
        }

        //Routes to the appropriate process routine based on the user menu choice
        static void ProcessMenuItem(Char menuItem, List<Contact> contactList)
        {
            switch (menuItem)
            {
                case 'C':
                    createContact();
                    break;
                case 'R':
                    removeContact(contactList);
                    break;
                case 'U':
                    updateContact(contactList);
                    break;
                case 'D':
                    LoadFromFile();
                    break;
                case 'S':
                    saveToFile();
                    break;

                case 'L':
                    sortByLastName(contactList);
                    break;
                case 'F':
                    sortByFirstName(contactList);
                       break;
                case 'P':
                       DisplayList(contactList);
                       break;
                case 'T':
                       sortByContactType();
                       break;
                case 'Q':

                       break;

            }                   
        }
//allows the user to remove a contact
         public static void removeContact(List<Contact> contactList) 
         {

             for (int i = 0; i < contactList.Count; i++)
               if (i % 5 == 0)
             contactList.RemoveAt(i);

        }
3个回答

4
您可以使用LINQ或Lambda表达式轻松完成以下操作:
在联系人的模型类中添加一个字段,例如电话号码本身。
在选择联系人时,在查询参数中提供两个条件
removeContact(List<Contact> contactList,int selectedContactPhoneNo)

你可以简单地执行以下操作:
contactList.RemoveAll(x => x.PhoneNo == selectedContactPhoneNo);

1
你可以按照以下方式定义函数:该函数接收List联系人姓名,然后从联系人列表中删除第一个出现的联系人姓名。
 public static void removeContact(List<Contact> contactList, object ContactName)
        {
            Contact contactToRemove = (Contact)contactList.AsEnumerable().Where
                                      (x => x.ContactName == ContactName || 
                                       x.ContactNumber == (int)ContactName).First();
            contactList.Remove(contactToRemove);
        }

我的联系人类是:

  class Contact
    {
        private int _ContactNumber;

        public int ContactNumber
        {
            get { return _ContactNumber; }
            set { _ContactNumber = value; }
        }
        private string  _ContactName;

        public string  ContactName
        {
            get { return _ContactName; }
            set { _ContactName = value; }
        }              
   }

您的情况类似于以下内容:
 case 'R':
         Console.WriteLine("enter the contact name/Contact Number To delete");
         removeContact(contactList, Console.Read().ToString() );
         break;

在这种情况下,联系人姓名可能相同,您应该选择一个不匹配的唯一字段,最好使用电话号码。 - VizardCrawler
@ vishal :我已经更新了我的答案,现在它能够根据联系人姓名或联系人号码来删除详细信息。 - user4959983
但是,永远不应该使用联系人姓名删除联系人!!因为一个名字可能会重复,可能会有两个人拥有相同的名字!!虽然感谢您更新了它,但仍然应该始终删除或编辑唯一的内容,我建议使用数字本身或ID(如果有)。 - VizardCrawler
@vishal:你说得对。感谢建议。你的回答也很棒。我支持你。 - user4959983

1
一个简单的方法是循环遍历联系人列表,然后使用联系人属性之一作为搜索关键字。
//Search contact via number
//Depending which key you would want for example Contact's Number:
int number = 1;
Contact contact = null;
for (int i = 0; i < contactList.Count; i++)
{
    if (contactList[i].Number == number)
    {
        contact = contactList[i]; //Assign contact 
        break;
    }
}

//Remove contact from list
if (contact != null) //If not null, it means we found it. Remove it from the list:
{
    contactList.Remove(contact);
}

你可以创建一个函数来实现上述操作,这样在搜索并删除列表项时可以传入特定的关键字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接