Jus*_*ner 131
除非我遗漏了某些东西,否则你应该能够使用简单的东西Distinct().虽然它不会是你能提出的最复杂的实现,但它会告诉你是否删除了任何重复项:
var list = new List<string>();
// Fill the list
if(list.Count != list.Distinct().Count())
{
// Duplicates exist
}
Run Code Online (Sandbox Code Playgroud)
Ali*_*Ali 44
根据Eric White关于如何使用LINQ查找重复项的文章:
查找重复项的简单方法是编写按标识符分组的查询,然后筛选具有多个成员的组.在下面的示例中,我们想要知道4和3是重复的:
Run Code Online (Sandbox Code Playgroud)int[] listOfItems = new[] { 4, 2, 3, 1, 6, 4, 3 }; var duplicates = listOfItems .GroupBy(i => i) .Where(g => g.Count() > 1) .Select(g => g.Key); foreach (var d in duplicates) Console.WriteLine(d); // 4,3
Kyl*_*Mit 20
如果在列表的早期存在重复项时允许短路,则可以添加HashSet<T>并检查其.Add方法的返回值.
通过使用,.Any您可以在发现重复时立即短路枚举.
这是C#和VB中的LINQ扩展方法:
public static bool ContainsDuplicates<T>(this IEnumerable<T> enumerable)
{
var knownKeys = new HashSet<T>();
return enumerable.Any(item => !knownKeys.Add(item));
}
Run Code Online (Sandbox Code Playgroud)
<Extension>
Public Function ContainsDuplicates(Of T)(ByVal enumerable As IEnumerable(Of T)) As Boolean
Dim knownKeys As New HashSet(Of T)
Return enumerable.Any(Function(item) Not knownKeys.Add(item))
End Function
Run Code Online (Sandbox Code Playgroud)
注意:要检查是否没有重复项,只需更改Any为All
Tri*_*dad 13
将所有项目放在一个集合中,如果集合的计数与列表的计数不同,则存在重复.
bool hasDuplicates<T>(List<T> myList) {
var hs = new HashSet<T>();
for (var i = 0; i < myList.Count; ++i) {
if (!hs.Add(myList[i])) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
应该比Distinct更有效,因为不需要遍历所有列表.
小智 8
您可以使用 IEnumerable.GroupBy 方法。
var list = new List<string> {"1", "2","3", "1", "2"};
var hasDuplicates = list.GroupBy(x => x).Any(x => x.Skip(1).Any());
Run Code Online (Sandbox Code Playgroud)