首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >测试列表中的所有值是否都是唯一的

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

Stack Overflow用户
提问于 2013-08-19 05:35:17
回答 8查看 64.7K关注 0票数 98

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

代码语言:javascript
复制
List<byte> theList = new List<byte> { 1,4,3,6,1 };

检查是否所有值都是不同的最好方法是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-08-19 05:36:55

代码语言:javascript
复制
bool isUnique = theList.Distinct().Count() == theList.Count();
票数 188
EN

Stack Overflow用户

发布于 2013-08-19 05:59:44

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

代码语言:javascript
复制
var distinctBytes = new HashSet<byte>(theList);
bool allDifferent = distinctBytes.Count == theList.Count;

或者是另一种更微妙、更有效的方法:

代码语言:javascript
复制
var diffChecker = new HashSet<byte>();
bool allDifferent = theList.All(diffChecker.Add);

如果元素已经存在于HashSet中而无法添加,则HashSet.Add返回falseEnumerable.All在第一个"false“处停止。

票数 82
EN

Stack Overflow用户

发布于 2017-02-02 19:59:00

好的,这是我能想到的使用标准.Net的最有效的方法

代码语言:javascript
复制
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;
    }
}

从本质上讲,如果您所要做的只是找到第一个副本,那么枚举整个序列两次有什么意义。

我可以通过特殊的格式化空的和单元素的序列来优化这一点,但这会降低可读性/可维护性,并带来最小的收益。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18303897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档