如何查找List<string>
是否有重复值?
我试过下面的代码。有没有最好的方法来实现?
var lstNames = new List<string> { "A", "B", "A" };
if (lstNames.Distinct().Count() != lstNames.Count())
{
Console.WriteLine("List contains duplicate values.");
}
答案 0 :(得分:97)
尝试使用GroupBy
和Any
之类的;
lstNames.GroupBy(n => n).Any(c => c.Count() > 1);
GroupBy
方法;
根据指定的键对序列的元素进行分组 选择器功能并使用a为每个组投影元素 指定的功能。
Any
方法,它会返回boolean
;
确定序列的任何元素是否存在或满足a 条件。
答案 1 :(得分:40)
如果您正在寻找最有效的方法,
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;
}
}
一旦找到第一个重复的就会停止。如果您将在多个地方使用它,可以将它包装在方法(或扩展方法)中。
答案 2 :(得分:24)
基于散列技术的答案的通用和紧凑扩展版本:
public static bool AreAnyDuplicates<T>(this IEnumerable<T> list)
{
var hashset = new HashSet<T>();
return list.Any(e => !hashset.Add(e));
}
答案 3 :(得分:11)
var duplicateExists = lstNames.GroupBy(n => n).Any(g => g.Count() > 1);
答案 4 :(得分:0)
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;
}
}
答案 5 :(得分:-2)
尝试转换为字典怎么样。
public bool HasDuplicates(List<String> lstNames)
{
try
{
var test = lstNames.ToDictionary(x => x, y => y);
return false;
}
catch (Exception ex)
{
return true;
}
}