Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何查找列表中存在重复值的列表<;字符串>;_C#_Linq_List - Fatal编程技术网

C# 如何查找列表中存在重复值的列表<;字符串>;

C# 如何查找列表中存在重复值的列表<;字符串>;,c#,linq,list,C#,Linq,List,如何查找列表是否有重复值 我尝试了以下代码。有什么最好的方法可以实现吗 var lstNames = new List<string> { "A", "B", "A" }; if (lstNames.Distinct().Count() != lstNames.Count()) { Console.WriteLine("List contains duplicate values."); } var lstNames=新列表{“A”、“B”、“A”}; if(lstNam

如何查找
列表
是否有重复值

我尝试了以下代码。有什么最好的方法可以实现吗

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

if (lstNames.Distinct().Count() != lstNames.Count())
{
    Console.WriteLine("List contains duplicate values.");
}
var lstNames=新列表{“A”、“B”、“A”};
if(lstNames.Distinct().Count()!=lstNames.Count())
{
WriteLine(“列表包含重复的值”);
}

尝试使用
GroupBy
任何类似的方法

lstNames.GroupBy(n => n).Any(c => c.Count() > 1);
方法

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

方法,它返回
布尔值

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


如果你在寻找最有效的方法

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;
    }
}
var lstNames=新列表{“A”、“B”、“A”};
var hashset=新hashset();
foreach(lstNames中的变量名)
{
如果(!hashset.Add(名称))
{
WriteLine(“列表包含重复的值”);
打破
}
}

将在找到第一个副本后立即停止。如果您要在多个地方使用它,您可以将其封装在一个方法(或扩展方法)中。

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

public static bool AreAnyDuplicates<T>(this IEnumerable<T> list)
{
    var hashset = new HashSet<T>();
    return list.Any(e => !hashset.Add(e));
}
public static bool AreAnyDuplicates(此IEnumerable列表)
{
var hashset=新hashset();
return list.Any(e=>!hashset.Add(e));
}
课程计划
{
静态void Main(字符串[]参数)
{
var listFruits=新列表{“苹果”、“香蕉”、“苹果”、“芒果”};
如果(FindDuplicates(listFruits)){WriteLine($“Yes we find duplicate”);};
ReadLine();
}
公共静态bool FindDuplicates(列表数组)
{
var dict=新字典();
foreach(数组中的var值)
{
if(dict.ContainsKey(值))
dict[值]+;
其他的
dict[值]=1;
}
foreach(dict中的var对)
{
如果(pair.Value>1)
返回true;
其他的
返回false;
}
返回false;
}
}  

对不起,伙计们。。我错过了简单的逻辑。请不要说对不起。我们都在这里学习..嗯。。我错过了简单的逻辑。我认为Any()比Count()更受欢迎,但我不知道Distinct()和GroupBy()之间的性能差异。我认为在列表的情况下,您需要按所有项分组,并且再次需要应用所有项中的Any()。我不知道如何与我的示例中仅使用Count()进行比较。这比OP中的代码更好吗?您仍然需要对所有项目进行分组,这样就不会出现任何短路。这不仅需要迭代所有元素来构建组,还需要迭代所有可能的组。你的原汁咖啡会更快。。。。该死的,自动更正。根据我的测试,原始代码至少比这快1.5倍(取决于输入)。用
c.Count()>c.Skip(1)替换
c.Count()>1
?+1性能在最坏的情况下比
GroupBy
@IlyaIvanov好十倍实际上,在最坏的情况下(没有重复),差不多,也许快一点。在最好的情况下(前两个项目是重复的),它会快100%,因为它将是O(1)而不是O(n)。在一般情况下,这取决于基础数据中的实际重复率,而无论基础数据如何,
GroupBy
Distinct
都需要相同的时间。“O”表示“最坏情况”。没有“在最好的情况下是O(x)”@JohnShedletsky'O(f)”代表的函数集的增长速度不超过f,也就是说,g(x)很酷,我已经将它添加到我的linq扩展中,不过我添加了一个重载来提供一个比较器。我知道这很旧,尽管创建一个扩展方法很酷,但从性能角度看,这是一个非常糟糕的方法。。它应该使用group by,而不是试图将每个列表对象插入hashset。@curiousBoy我很确定,
GroupBy
是在内部使用某种哈希结构实现的,因此基本上它应该具有相同的性能。据我所知,在
哈希集中添加元素在计算上是“便宜”的,最多使用与原始列表相同的内存量。另外,我也不确定,但让
GroupBy
Any
紧跟在一起可能不是很懒,因为很明显,这个解决方案将在第一个重复项上停止。你能解释一下为什么你认为它的性能很差吗?@Eluvatar我知道你很久以前就回答了这个问题,但是,如果你愿意分享的话,我很想看看你的代码。谢谢@ErickBrown是一个
HashSet
的构造函数,它接受一个定制的比较器,我认为@Eluvatar的意思是将它作为这个扩展的一个参数公开。
public static bool AreAnyDuplicates<T>(this IEnumerable<T> list)
{
    var hashset = new HashSet<T>();
    return list.Any(e => !hashset.Add(e));
}
 class Program
{
    static void Main(string[] args)
    {
        var listFruits = new List<string> { "Apple", "Banana", "Apple", "Mango" };
        if (FindDuplicates(listFruits)) { WriteLine($"Yes we find duplicate"); };
        ReadLine();
    }
    public static bool FindDuplicates(List<string> array)
    {
        var dict = new Dictionary<string, int>();
        foreach (var value in array)
        {
            if (dict.ContainsKey(value))
                dict[value]++;
            else
                dict[value] = 1;
        }
        foreach (var pair in dict)
        {
            if (pair.Value > 1)
                return true;
            else
                return false;
        }
        return false;
    }
}