检查列表多次包含相同的值

Mel*_*iss 6 c# list

问题

检查集合多次包含相同的数字.

如果它确实包含多次相同的数字,那么我想 保留第一个数字并为其余数字赋予一个新值,这与第一个数字相同.

列表newFitnessList确实包含这些数字:

0. 4054.230995  --> after code= 4054.230995
1. 4041.416004  --> after code= 4041.416004
2. 3926.227397  --> after code= 3926.227397
3. 4722.250903  --> after code= 4722.250903
4. 4722.250903  --> after code= 0
5. 4226.636776  --> after code= 4226.636776
6. 4061.499026  --> after code= 4061.499026
7. 3876.278254  --> after code= 3876.278254
8. 4041.416004  --> after code= 0
9. 4779.468077  --> after code= 4779.468077
10. 4226.636776  --> after code= 0
11. 3876.278254  --> after code= 0
12. 4779.468077  --> after code= 0
13. 3926.227397  --> after code= 0
Run Code Online (Sandbox Code Playgroud)

为了实现上面解释的解决方案,我尝试了以下代码,但没有发生任何事情.列表的输出与以前相同:

public List<double> sortDoppelganger(List<double> inputFitnessList)
{
  List<double> newFitnessList = inputFitnessList.ToList();
  for(int i = 0; i < newFitnessList.Count; i++)
  {
    double Nothing=0;
    double actual = newFitnessList[i];
    for(int j = newFitnessList.Count-1; j >= 0; j--)
    {
      double next = newFitnessList[j];
      if(actual == next)
      {
        next = Nothing;
      }
    }
  }
  return newFitnessList;
}
Run Code Online (Sandbox Code Playgroud)

如果有人知道我的代码有什么问题,我将非常感激.也许最好不要隐藏,我是编程的新手.

阅读完解释后:我试了两个想法.第一个是@Tim Schmelter的想法,第二个想法来自@ user3185569.

在这里你可以看看我想要实现的目标: 在此输入图像描述

蒂姆的建议在这里: 在此输入图像描述

这里有user3185569的建议: 在此输入图像描述

Tim*_*ter 8

您可以使用a HashSet<double>来查明是否存在重复:

public List<double> SortDoppelganger(List<double> inputFitnessList, double replacementValue = 0)
{
    HashSet<double> doppelgangerFinder = new HashSet<double>();
    for (int i = 0; i < inputFitnessList.Count; i++)
    {
        double value = inputFitnessList[i];
        bool istDoppelganger = !doppelgangerFinder.Add(value);
        if (istDoppelganger)
            inputFitnessList[i] = replacementValue;
    }
    return inputFitnessList;
}
Run Code Online (Sandbox Code Playgroud)

此解决方案修改原始列表.如果不需要,请在开头使用创建副本var newList = new List<double>(inputFitnessList).

对于它的价值,这里是一个适用于任何类型的通用扩展方法:

public static List<T> ReplaceDuplicates<T>(this IEnumerable<T> sequence, T replacementValue)
{
    HashSet<T> duplicateFinder = new HashSet<T>();
    List<T> returnList = new List<T>();
    foreach (T item in sequence)
    {
        bool isDuplicate = !duplicateFinder.Add(item);
        returnList.Add(isDuplicate ? replacementValue : item);
    }
    return returnList;
}
Run Code Online (Sandbox Code Playgroud)

说明:user3185569是对的,我忘了提到你做错了什么.主要问题是您尝试将替换值分配给局部变量next:

double next = newFitnessList[j];
if(actual == next)
{
  next = Nothing;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它与值或引用类型的差异无关.这不起作用的唯一原因是您只修改变量的值.不是变量在(newFitnessList[j])之前引用的值.该变量甚至不知道它已链接到列表.它只知道存储的价值.如果它是参考类型,问题将是相同的.通过将其替换为另一个值,列表将不会被修改.

简而言之,这将解决主要问题:

double next = newFitnessList[j];
if(actual == next)
{
  newFitnessList[j] = Nothing;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为如果使用它将从他的错误中学到任何东西,他需要知道他的代码有什么问题,这比为他提供另一种方法更好.有了这个答案,用户不知道为什么使用**复制局部变量**不会影响他的List中的值.他既不知道参考类型和价值类型之间的区别,这可能会让他在未来面临同样的错误. (2认同)