如何从添加到字典中的数组中删除重复值
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()
始终是 return
s 数组,即使用户指定了 size
或 0
。当您稍后测试 userInputArray == null
以查看您的用户是否提供了任何输入时,该测试将始终失败。当size
为0
时,您需要将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<,>
的作用域是for
循环,因此每次迭代您都会创建一个新的空Dictionary<,>
。在循环之外创建Dictionary<,>
,这样您就可以在循环之后访问它。
当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 < 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()
将只有return
和double[]
至少有一个元素,你可以这样写...
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"
),如果是 return
s true
,我们然后测试使当然,这也是一个积极的int
。
【讨论】:
我去看看。我可能已经找到了另一种解决方案,而无需通过 .NET 使用 Dictionary,但这也是另一种解决方案。谢谢你的回答!!! 我明白了。如果不需要Dictionary<,>
,那么double[]
或List<double>
也可以将索引“映射”到值。另外,我已经用ArrayOfDoublePrecisionFloatingPointValues()
的替代实现更新了我的答案,它总是return
s 一些 用户提供的值。以上是关于如何从添加到字典中的数组中删除重复值的主要内容,如果未能解决你的问题,请参考以下文章