如何从添加到字典中的数组中删除重复值

Posted

技术标签:

【中文标题】如何从添加到字典中的数组中删除重复值【英文标题】:How to Remove Duplicate Values from Array that is added into Dictionary 【发布时间】:2021-12-26 07:32:11 【问题描述】:

我有一个用户输入:

public double[] ArrayOfDoublePrecisionFloatingPointValues()
    

        Console.Write("Enter how many values (double in C#) you want to enter in the Array of Doubles: ");
        int size = Convert.ToInt32(Console.ReadLine());  //Convert userinput to integer
        double[] userInput = new double[size];

        for (int i = 0; i < size; i++)
        
            Console.Write("Type Double Value 0: ", i + 1);
            userInput[i] = Convert.ToDouble(Console.ReadLine());
        

        return userInput;
    

当我输入这些值时,它会创建重复项,我相信这是基于 for 循环根据用户建立的大小重复输入数组值的次数。现在我看不到另一种让用户输入创建数组的方法。因此,当我将数组放入字典时,我重复了相同的值。我不希望数组重复。我只想要用户输入的原始数组。这是字典的代码:

 UserInput u = new UserInput();
       double[] userInputArray = u.ArrayOfDoublePrecisionFloatingPointValues();

        for (int i = 0; i < userInputArray.Length; i++)
        
            if(userInputArray == null)
            
                Console.WriteLine("You have entered no values!  Add values");
            
            else if(userInputArray != null)
            
                Dictionary<int, double> indexAndIndexValue = new Dictionary<int, double>();
                foreach (var (j, t)  in userInputArray.Enumerate())
                
                    indexAndIndexValue.Add(j, t);
                    
                
                foreach (var (key, value) in indexAndIndexValue)
                
                    Console.WriteLine(key + ":" + value);
                    Console.Write("------");
                    Console.WriteLine("Count: " + indexAndIndexValue.Count);
                

请注意,我尝试过 Distinct().ToArray() 无济于事。我们将不胜感激。

【问题讨论】:

【参考方案1】:
    ArrayOfDoublePrecisionFloatingPointValues() 始终是 returns 数组,即使用户指定了 size0。当您稍后测试 userInputArray == null 以查看您的用户是否提供了任何输入时,该测试将始终失败。当size0 时,您需要将ArrayOfDoublePrecisionFloatingPointValues() 更改为return null;...
    public double[] ArrayOfDoublePrecisionFloatingPointValues()
    
        Console.Write("Enter how many values (double in C#) you want to enter in the Array of Doubles: ");
        int size = Convert.ToInt32(Console.ReadLine());  //Convert userinput to integer
    
        //TODO: Warn the user about negative input
        if (size < 1)
        
            return null;
        
    
        double[] userInput = new double[size];
        for (int i = 0; i < size; i++)
        
            Console.Write("Type Double Value 0: ", i + 1);
            userInput[i] = Convert.ToDouble(Console.ReadLine());
        
    
        return userInput;
    
    
    ...或测试userInputArray.Length == 0...
    if (userInputArray.Length == 0)
    
        Console.WriteLine("You have entered no values!  Add values");
    
    else
    
        // ...
    
    我的代码将执行后者。 您的Dictionary&lt;,&gt; 的作用域是for 循环,因此每次迭代您都会创建一个新的空Dictionary&lt;,&gt;。在循环之外创建Dictionary&lt;,&gt; ,这样您就可以在循环之后访问它。 当if 分支 (userInputArray != null/userInputArray.Length == 0) 测试(但失败)“用户确实提供了输入”时,您无需在 else 分支中测试“用户未提供输入” . 您不需要检查用户是否在for 循环的每次迭代中都提供了任何输入;要么他们做了,要么他们没有,所以你的for应该嵌套在if...else中,而不是相反。 您正在为userInputArray 的每个元素添加userInputArray (foreach (var (j, t) in userInputArray.Enumerate())) 的每个元素 (for (int i = 0; i &lt; userInputArray.Length; i++))。相反,您应该只添加 current 索引和值。

在进行了这些更改之后,我最终得到了这个......

UserInput u = new UserInput();
double[] userInputArray = u.ArrayOfDoublePrecisionFloatingPointValues();
Dictionary<int, double> indexAndIndexValue = new Dictionary<int, double>();

if (userInputArray.Length == 0)

    Console.WriteLine("You have entered no values!  Add values");

else

    for (int i = 0; i < userInputArray.Length; i++)
    
        indexAndIndexValue.Add(i, userInputArray[i]);
    

    foreach (var (key, value) in indexAndIndexValue)
    
        Console.WriteLine(key + ":" + value);
        Console.Write("------");
        Console.WriteLine("Count: " + indexAndIndexValue.Count);
    


//TODO: Use indexAndIndexValue, which may be empty

我将显示indexAndIndexValue 内容的代码移到for 循环之后,以便您可以看到最终内容,但是,如果您想查看,可以将其保留在for 循环内的位置它如何随着每次迭代而变化。

如果你想确保ArrayOfDoublePrecisionFloatingPointValues() 将只有returndouble[] 至少有一个元素,你可以这样写...

public double[] ArrayOfDoublePrecisionFloatingPointValues()

    int size;
    while (true)
    
        Console.Write("Enter a positive number of values (double in C#) you want to enter in the Array of Doubles: ");
        string input = Console.ReadLine();
        
        if (!int.TryParse(input, out size) || size < 1) //Convert userinput to integer
        
            Console.WriteLine($"ERROR: \"input\" is not a positive integer.");
        
        else
        
            break;
        
    

    double[] userInput = new double[size];
    for (int i = 0; i < size; i++)
    
        Console.Write("Type Double Value 0: ", i + 1);
        //TODO: Use double.TryParse() to reject non-Double input
        // https://docs.microsoft.com/dotnet/api/system.double.tryparse
        userInput[i] = Convert.ToDouble(Console.ReadLine());
    

    return userInput;

int.TryParse()return false 在传递非整数输入时(例如 """ABC""123.456"),如果是 returns true,我们然后测试使当然,这也是一个积极的int

【讨论】:

我去看看。我可能已经找到了另一种解决方案,而无需通过 .NET 使用 Dictionary,但这也是另一种解决方案。谢谢你的回答!!! 我明白了。如果不需要Dictionary&lt;,&gt;,那么double[]List&lt;double&gt; 也可以将索引“映射”到值。另外,我已经用ArrayOfDoublePrecisionFloatingPointValues() 的替代实现更新了我的答案,它总是returns 一些 用户提供的值。

以上是关于如何从添加到字典中的数组中删除重复值的主要内容,如果未能解决你的问题,请参考以下文章

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

如何从IOS中的字典数组中删除重复性? [关闭]

尝试从数组中的值中删除基于 MKMap 的引脚

从数组值中过滤字典

试图快速删除从firebase检索到的数组中的重复值

如何从字典中的列表中删除元素[重复]