c# - 如何快速判断列表是否仅包含重复项?

标签 c# .net list duplicates mahjong

有多个相关问题,但我正在寻找针对我的案例的解决方案。有一个(通常)14 个整数的数组。如何快速判断每个 int 是否恰好出现两次(即有 7 对)?取值范围为 1 到 35。这里的主要方面是性能。

作为引用,这是我目前的解决方案。它的编写尽可能与规范相似并且没有考虑性能,所以我确信它可以大大改进:

var pairs = Array
    .GroupBy (x => x)
    .Where (x => x.Count () == 2)
    .Select (x => x.ToList ())
    .ToList ();
IsSevenPairs = pairs.Count == 7;

使用 Linq 是可选的。我不在乎如何,只要它快:)

编辑:有一种特殊情况,即 int 出现 2n 次且 n > 1。在这种情况下,检查应该失败,即应该有 7 个不同的对.

编辑:结果 我通过微小的修改测试了 Ani 和 Jon 的解决方案,并在目标应用程序的多个基准测试运行期间发现,Ani 在我的机器上的吞吐量大约是 Jon 的两倍(Win7-64 上的一些 Core 2 Duo)。生成整数数组所花的时间与相应检查的时间差不多,所以我对结果很满意。谢谢大家!

最佳答案

好吧,鉴于您的确切要求,我们可以更聪明一些。像这样:

public bool CheckForPairs(int[] array)
{
    // Early out for odd arrays.
    // Using "& 1" is microscopically faster than "% 2" :)
    if ((array.Length & 1) == 1)
    {
        return false;
    }

    int[] counts = new int[32];
    int singleCounts = 0;
    foreach (int item in array)
    {
        int incrementedCount = ++counts[item];
        // TODO: Benchmark to see if a switch is actually the best approach here
        switch (incrementedCount)
        {
            case 1:
                singleCounts++;
                break;
            case 2:
                singleCounts--;
                break;
            case 3:
                return false;
            default:
                throw new InvalidOperationException("Shouldn't happen");
        }
    }
    return singleCounts == 0;
}

基本上,这会跟踪您还有多少未配对的值,如果找到三个相同的值,就会“提前出局”。

(我不知道这比 Ani 递增然后检查不匹配对的方法更快还是更慢。)

关于c# - 如何快速判断列表是否仅包含重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185766/

相关文章:

python - 是否有更 pythonic 的方式来分解函数参数的列表?

c# - 如何克隆对象

c# - 删除具有一对一可选关系的实体时出现 EntityFramework 错误

c# - C# 和 PHP 中的 TripleDES 加密结果不一样(PKCS7、ECB)?

c# - 如何在 VB.NET 中执行此操作?

C# 将 DLL 限制为只有一个实例

c# - EF 不同 (IEqualityComparer) 错误

S 表达式的列表,(文字)数据的向量?

r - 如何将变量列表附加到 R 数据框特定行中的列表?

css - 有没有办法重新设计微软机器人的网络聊天界面?