【问题标题】:Checking for duplicate values in a list - Can this be made more elegant? [duplicate]检查列表中的重复值 - 这可以更优雅吗? [复制]
【发布时间】:2019-12-01 20:28:27
【问题描述】:

给定一个列表中的 n 个值的列表。我编写了以下代码来遍历集合并将每个值与其他成员进行比较。

我觉得这有点“hacky”,但可能有更好的方法。

谁能给点建议?

Console.WriteLine("Enter a series of numbers seperated by a hyphen (-): ");
            var userInput = Console.ReadLine().Split('-');

            var inputList = new List<int>();

            if (userInput.Count() > 1)
            {
                foreach (var item in userInput)
                {
                    inputList.Add(int.Parse(item));
                }
            }
            else
            {
                Console.WriteLine("Exiting....");
                return;
            }

            var count = 0;

            foreach (var num in inputList)
            {
                for (int i = 0; i < inputList.Count; i++)
                {
                    if (num == inputList[i])
                    {
                        count++;
                    }

                    if (count != inputList.Count())
                    {
                        break;
                    }
                }
            }

【问题讨论】:

  • list.Count == list.Distinct().Count()
  • var inputList = userInput.Select(int.Parse).ToList();
  • 如果你想要一个重复值的列表:var duplicates = list.GroupBy(n =&gt; n).Where(g =&gt; g.Skip(1).Any()).Select(g =&gt; g.Key).ToList();
  • 您的代码实际上不会工作 - 您对 count != inputList.Count() 的测试(ps 不要在同一代码中使用 inputList.CountinputList.Count())每次都会提前退出内部循环.
  • 不使用 LINQ,在 IEnumerable 中测试重复的规范方法是将每个成员添加到 HashSet 并注意 Add 何时返回 false 表示重复添加尝试.

标签: c# for-loop


【解决方案1】:

这是使用 HashSet 跟踪重复项的非 LINQ 方式:

Console.WriteLine("Enter a series of numbers separated by a hyphen (-): ");
var inputList = Console.ReadLine().Split('-').Select(s => Int32.Parse(s)).ToList();

if (inputList.Count <= 1) {
    Console.WriteLine("Exiting....");
    return;
}

var nonDups = new HashSet<int>();
var dupCount = 0;
foreach (var num in inputList) {
    if (!nonDups.Add(num)) {
        ++dupCount;
    }
}

Console.WriteLine($"There {(dupCount == 1 ? "was" : "were")} {dupCount} duplicate{(dupCount == 1 ? "" : "s")}");

【讨论】:

  • 您写了一个条件来使消息在语法上正确?仅此一项。
  • 我是那些无法忍受语法不正确的代码 cmets 的人之一,更不用说公众可以看到的消息了。
  • @CodingYoshi 我的标准扩展方法之一:public static string ToPluralSuffix(this int n, string suffix = "s") =&gt; n == 1 ? "" : suffix;
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
相关资源
最近更新 更多