如何查找List在List <string>中具有重复值

Pra*_*thi 58 c# linq list

如何查找是否List<string>有重复值?

我试过下面的代码.有没有最好的方法来实现?

var lstNames = new List<string> { "A", "B", "A" };

if (lstNames.Distinct().Count() != lstNames.Count())
{
    Console.WriteLine("List contains duplicate values.");
}
Run Code Online (Sandbox Code Playgroud)

Son*_*nül 99

尝试使用GroupByAny喜欢;

lstNames.GroupBy(n => n).Any(c => c.Count() > 1);
Run Code Online (Sandbox Code Playgroud)

GroupBy 方法;

根据指定的键选择器函数对序列的元素进行分组,并使用指定的函数为每个组投影元素.

Any方法,它返回boolean;

确定序列的任何元素是否存在或满足条件.

  • ...该死的,自动更正. (13认同)
  • 这比OP中的代码更好吗?您仍然需要对所有项目进行分组,因此这里没有任何短路. (3认同)
  • 这不仅需要遍历所有元素来构建组,它还必须遍历所有组.你原来的咖啡会更快. (3认同)
  • 如何用`c.Skip(1).Any()`替换`c.Count()> 1`? (2认同)

Raw*_*ing 45

如果您正在寻找最有效的方法,

var lstNames = new List<string> { "A", "B", "A" };
var hashset = new HashSet<string>();
foreach(var name in lstNames)
{
    if (!hashset.Add(name))
    {
        Console.WriteLine("List contains duplicate values.");
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦找到第一个副本就会停止.如果您要在多个地方使用它,可以将它包装在方法(或扩展方法)中.

  • 在最坏的情况下,+1 性能比 `GroupBy` 好十倍 (2认同)
  • @IlyaIvanov实际上,在最糟糕的情况下(没有重复),它大致相同,可能只是稍微快一点.在最好的情况下(前两项是重复的),它快100%,因为它将是O(1)而不是O(n).在一般情况下,它将取决于基础数据中实际重复率,而"GroupBy"和"Distinct"在不考虑基础数据的情况下需要相同的时间. (2认同)
  • @JohnShedletsky 'O(f)' 表示增长不比 f 快的函数集,也就是说,g(x) &lt;= f(x) * C for g in O(f) 和一些常数 C ,如果 x 足够大。它并不意味着最好或最坏的情况。 (2认同)

Zol*_*ási 25

基于哈希技术的答案的通用和紧凑扩展版本:

public static bool AreAnyDuplicates<T>(this IEnumerable<T> list)
{
    var hashset = new HashSet<T>();
    return list.Any(e => !hashset.Add(e));
}
Run Code Online (Sandbox Code Playgroud)

  • @ErickBrown `HashSet&lt;T&gt;` 的构造函数确实接受自定义比较器,我认为 @Eluvatar 意味着将其公开为此扩展的参数。 (2认同)

Nas*_*eer 11

var duplicateExists = lstNames.GroupBy(n => n).Any(g => g.Count() > 1);
Run Code Online (Sandbox Code Playgroud)