【问题标题】:Remove second occurrence of value from array C#从数组 C# 中删除第二次出现的值
【发布时间】:2020-08-17 16:18:46
【问题描述】:

我的代码当前所做的不是删除第一次出现的重复值,而是如何让它删除第二次出现的重复值?

namespace deletenumber
{
    class Program
    {    
        public static void Main(String[] args)
        {

            Random r = new Random();

            int[] a = new int[10];

            for (int i = 0; i < 10; i++)
                a[i] = r.Next(1, 100);

            for (int i = 0; i < 10; i++)
                Console.WriteLine(" a [" + i + "] = " + a[i]);

            Console.WriteLine();
            Console.ReadLine();

            Console.WriteLine("What number do you want to delete?");
            int item = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine();

            int index = Array.IndexOf(a, item);
            a = a.Where((b, c) => c != index).ToArray();

            Console.WriteLine(String.Join(", ", a));
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 当你将作业作为任务提交时,你应该总是透露,你应该展示你尝试了什么,以及你是如何进行单元测试的。你什么都不做。
  • @MortenBork 让我们对新用户更加耐心。这就是 this 帖子存在的原因。
  • @McCloud54 请查看this 了解如何在 SO 中提问。
  • 不知道真正的任务是什么。您可能会被要求实际删除该数字的第二个实例(不是第三个或更多可能存在的实例),也可能会要求您使用恒定空间以及以最有效的方式执行此操作。从这个意义上说,这个问题留给想象的空间太多了。

标签: c# arrays .net duplicates


【解决方案1】:

我不确定为什么您可能只想删除第二个匹配项,因为无论删除哪个重复项,都应该删除,对吗?

无论如何,有几种方法可以实现您想要的。 我不会在这里直接写解决方案,但会提出您可以使用的方法以实现您想要的:

  1. Array.LastIndexOf
  2. 再次使用相同的IndexOf 方法查找第二个匹配项,从上一次匹配项开始搜索 (myArray.IndexOf("string", last_indexof_index);)

一般来说,如果您想要一组独特的元素,请考虑使用HashSet&lt;T&gt;(官方文档here)。

您还可以将现有收藏转换为HashSet&lt;int&gt;

int[] a = new int[10];
var set = new HashSet<int>(a);

【讨论】:

  • 请注意,第一个解决方案不会删除第二个,而是最后一个。因此,如果您有 3 次或更多次出现该数字,它将始终删除最后一个,但不会明确删除第二个。
【解决方案2】:

您可以将数组转换为 List,然后在将其转换回数组之前删除索引:

var list = new List<int>(a);
list.RemoveAt(index);
a = list.ToArray();

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2017-07-07
    • 2021-04-06
    • 2021-02-17
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多