检查列表中是否有重复项

3
我可以帮助您翻译,以下是内容:

我有一个名为com的列表,其中包含一堆整数。我需要检查该列表以确保每个整数仅在列表中存在一次。

因此,如果:

com{1,2,3,4,1,3}

我需要一些代码来检查数字1和数字3是否都出现了两次。这是我最好的猜测:

for (int j = 0; j < com.Count; j++)
        {
            if (com.Contains(com[j]))
            {
                lion += 1;
            }
            else
            {
                lion = 0;
            }   
        }

但它没有起作用。有人能帮我吗?
4个回答

7

以下是使用LINQ的简单方法,但可能不太高效:

using System.Linq;

...

bool containsRepeats = com.Count() != com.Distinct().Count();

如果你想知道什么是重复的,请参考 pratapchandra 的回答 - George Duckett
你是我的英雄。我已经花了最近3个小时尝试找到一种检查它的方法。 - Oedum

2

您可以通过将每个项目添加到HashSet<T>中来确定集合是否包含重复项。如果该项已经存在,则HashSet<T>.Add Method返回false:

public static bool HasDuplicate<T>(this IEnumerable<T> source)
{
    var h = new HashSet<int>();
    return source.Any(x => !h.Add(x));
}

如果您只想从集合中删除所有重复项,则可以使用Enumerable.Distinct扩展方法:(详情请参阅)
var result = new[] { 1, 2, 3, 4, 1, 3 }.Distinct();
// result == { 1, 2, 3, 4 }

+1 因为我想象它比我的方法更有效率,因为它是一个提前退出的机制。 - George Duckett

1

你可以试试这样做...

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);

0

以下是实现此操作的方法:

public static bool LinqAny<T>(IEnumerable<T> enumerable)
{
    HashSet<T> set = new();

    return enumerable.Any(element => !set.Add(element));
}

public static bool LinqAll<T>(IEnumerable<T> enumerable)
{
    HashSet<T> set = new();

    return !enumerable.All(set.Add);
}

public static bool LinqDistinct<T>(IEnumerable<T> enumerable)
{
    return enumerable.Distinct().Count() != enumerable.Count();
}

public static bool ToHashSet<T>(IEnumerable<T> enumerable)
{
    return enumerable.ToHashSet().Count != enumerable.Count();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接