允许用户从列表中删除项目

时间:2017-01-05 17:47:54

标签: c# list generics

我是自学C#并且一直试图弄清楚如何允许用户能够通过输入他们的列表 从列表 中删除项目及其索引编号索引编号或键入单词。

我已经用谷歌搜索并尝试了许多方法来做到这一点,但每次我想出一个方法,它会删除我会选择的元素,但索引并没有消失。示例(列表:0.hat,1.mat,2.fat以及每当我输入“1”或“mat”来删除'mat'时它会将列表显示为0.hat 1.fat并且我想要它显示0.hat,2.fat)

这是我最近尝试过的事情:

  string[] stringList = new string[] { "hat", "mat", "fat" };
        //Creating list
        List<string> list = new List<string>(stringList);
        string answer;
        //ordering list backwards Z-A
        list.Sort((a, b) => -1 * a.CompareTo(b));
        //loop to allow them to continue removing items
        while (true)
        {
            //Displaying list to console
            for (int i = 0; i < list.Count; i++)
            {
                //display list
                Console.WriteLine("{0}.{1}", i, list[i]);
            }

            //This is blank
            Console.WriteLine();
            //instructions what to do
            Console.WriteLine("Choose from the list to remove an item: ");
            //this will store the users input
            answer = Console.ReadLine();
            answer = answer.ToLower();

            -- this is where I put the removing at --

            //Making sure user does not crash program
            if (!string.IsNullOrEmpty(answer))
            {
                var index = list.FindIndex(i => i == answer);
                foreach (var item in list)
                {
                    if (index >= 0)
                    {
                        list.RemoveAt(index);
                    }
                }
            }

我在这里使用的方法不会删除任何内容。 我很难理解。 如果有人能够提供一些很棒的见解。感谢

4 个答案:

答案 0 :(得分:1)

您可以通过将字符串传递给.Remove()方法来删除字符串而无需查找索引。同时删除foreach循环,因为它是多余的,你没有在那里做任何事情。

if (!string.IsNullOrEmpty(answer))
{
    list.Remove(answer);
}

使用Dictionary您可以访问键或值并根据需要删除。

var list = new Dictionary<int, string>
{
    { 0, "hat" },
    { 1, "mat" },
    { 2, "fat" }
};

var item = list.FirstOrDefault(kvp => kvp.Value == "hat");
// Remove by value
list.Remove(item.Key);
// Remove by key
list.Remove(0);

打印结果

foreach (var kvp in list)
{
    Console.WriteLine(kvp.Key + " " + kvp.Value);
}

答案 1 :(得分:1)

不使用list,而是使用dictionary,其中key是item的索引。在这种情况下,当您删除项目时,您将保留项目的原始索引。

答案 2 :(得分:0)

按数据删除

list.Remove(answer);

按索引删除

var index = list.FindIndex(i => i == answer);

    list.RemoveAt(index);

答案 3 :(得分:0)

原始问题:

  

如何&#34;从列表中删除项目及其索引号   输入索引号或在。&#34;

中输入单词

在C#中有很多方法可以做到这一点。甚至有多种类型。你发现了一个,List<T>,这当然是一种方法,但可能不是最好的方法。你也可以做一个字符串数组。 Systems.Collections.Generic命名空间中还有其他几种类型的集合,以及List<T>

但到目前为止最简单的方法是使用Dict<TKey, TValue>

如何?查看我提供的链接中的示例,或执行以下操作:

var a = new Dictionary<int, string>(){
    {0, "hat"},
    {1, "mat"},
    {2, "fat"}
};

a.Remove(0); // remove by key
a.Where(i => i.Value != "mat"); // remove by value