测试列表中的所有值是否唯一

时间:2013-08-18 21:35:17

标签: c#

我有一个小的字节列表,我想测试它们都是不同的值。 例如,我有这个:

List<byte> theList = new List<byte> { 1,4,3,6,1 };

检查所有值是否相同的最佳方法是什么?

8 个答案:

答案 0 :(得分:132)

bool isUnique = theList.Distinct().Count() == theList.Count();

答案 1 :(得分:57)

这是另一种方法,它比Enumerable.Distinct + Enumerable.Count更有效(如果序列不是集合类型,则更是如此)。它使用HashSet<T>来消除重复,在查找中非常有效并且具有count属性:

var distinctBytes = new HashSet<byte>(theList);
bool allDifferent = distinctBytes.Count == theList.Count;

或另一种 - 更微妙和有效 - 的方法:

var diffChecker = new HashSet<byte>();
bool allDifferent = theList.All(diffChecker.Add);
如果元素无法添加,则

HashSet<T>.Add会返回false,因为它已经在HashSet中。 Enumerable.All停在第一个“假”上。

答案 2 :(得分:5)

好的,这是我能想到的使用标准.Net

的最有效方法
using System;
using System.Collections.Generic;

public static class Extension
{
    public static bool HasDuplicate<T>(
        this IEnumerable<T> source,
        out T firstDuplicate)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }

        var checkBuffer = new HashSet<T>();
        foreach (var t in source)
        {
            if (checkBuffer.Add(t))
            {
                continue;
            }

            firstDuplicate = t;
            return true;
        }

        firstDuplicate = default(T);
        return false;
    }
}

基本上,如果您想要做的就是找到第一个副本,那么两次枚举整个序列的重点是什么。

我可以通过特殊的套管空单元素序列来优化这一点,但这样会因可读性/可维护性而以最小的增益降低。

答案 3 :(得分:1)

还可以:使用哈希集

var uniqueIds = new HashSet<long>(originalList.Select(item => item.Id));

            if (uniqueIds.Count != originalList.Count)
            {
            }

答案 4 :(得分:0)

有很多解决方案。

毫无疑问,使用LINQ作为“juergen d”和“Tim Schmelter”提到的更美丽。

但是,如果你没有“复杂性”和速度,最好的解决方案就是自己实现它。 其中一个解决方案是创建一个N大小的数组(对于字节为256)。 并循环数组,并在每次迭代时将测试匹配数字索引,如果值为1,如果它,这意味着我已经增加数组索引,因此数组不明显,否则我将增加数组单元格并继续检查

答案 5 :(得分:0)

另一种解决方案,如果你想找到重复的值。

var values = new [] { 9, 7, 2, 6, 7, 3, 8, 2 };

var sorted = values.ToList();
sorted.Sort();
for (var index = 1; index < sorted.Count; index++)
{
    var previous = sorted[index - 1];
    var current = sorted[index];
    if (current == previous)
        Console.WriteLine(string.Format("duplicated value: {0}", current));
}

输出:

duplicated value: 2
duplicated value: 7

here

答案 6 :(得分:0)

使用DistinctGroupBy类似的逻辑:

var isUnique = theList.GroupBy(i => i).Count() == theList.Count;

答案 7 :(得分:0)

我检查IEnumerable(aray,list等)是否是唯一的:

var isUnique = someObjectsEnum.GroupBy(o => o.SomeProperty).Max(g => g.Count()) == 1;