【问题标题】:Search for an existing object in a list在列表中搜索现有对象
【发布时间】:2015-06-09 10:59:46
【问题描述】:

这是我在这里的第一个问题,所以我希望我做得对。
我必须创建一个整数数组列表:

List<int[]> finalList = new List<int[]>();

为了存储K个元素与N个数字的所有组合。

例如:

N=5, K=2 => {1,2},{1,3},{1,4},...

一切都很好,但我想避免列表中相同组合的重复(例如{1,2}{2,1})。因此,在将 tmpArray(我临时存储新组合的位置)添加到列表中之前,我想检查它是否已经存储。

这就是我正在做的事情:

  • 使用下一个组合创建 tmpArray (OK)
  • 对 tmpArray 排序(确定)
  • 使用以下代码检查列表是否已包含 tmpArray:

    if (!finalList.Contains(tmpArray))
        finalList.Add(tmpArray);
    

但它不起作用。谁能帮我解决这个问题?

【问题讨论】:

  • 您是否首先考虑避免重复?例如。只添加元组(n1, n2, ..., nK) 为哪个n1 &lt; n2 &lt; ... &lt; nK

标签: c# arrays list contains exists


【解决方案1】:

如果我没记错的话,contains 要么检查值数据类型的值,要么检查对象类型的地址。数组是一种对象类型,因此包含仅检查内存中的地址是否存储在您的列表中。您必须检查此列表中的每个项目并执行某种类型的算法来检查数组的值是否在列表中。

想到 Linq、Lambda 或蛮力检查。

BrokenGlass 对 Linq 和 Lambda 提出了很好的建议。

蛮力:

bool itemExists = true;
foreach (int[] ints in finalList)
{
    if (ints.Length != tmpArray.Length)
    {
        itemExists = false;
        break;
    }
    else
    {
        // Compare each element
        for (int i = 0; i < tmpArray.Length; i++)
        {
            if (ints[i] != tmpArray[i])
            {
                itemExists = false;
                break;
            }
        }

        // Have to check to break from the foreach loop
        if (itemExists == false)
        {
            break;
        }
    }
}

if (itemExists == false)
{
    finalList.add(tmpArray);
}

【讨论】:

【解决方案2】:

Array 是一个引用类型 - 您的 Contains 查询不会执行您想要的操作(按顺序比较所有成员)。

你可以这样使用:

if (!finalList.Any(x => x.SequenceEqual(tmpArray))
{
    finalList.Add(tmpArray);
}

(确保在文件顶部添加using System.Linq

我建议您了解更多关于value vs. reference types、Linq 和 C# 数据结构基础的知识。虽然上面的查询应该可以工作,但它会很慢 - O(n*m) 其中 n = finalListm 每个数组长度中的数组数。

对于较大的数组,一些可以让您更快比较的预计算(例如,每个数组的哈希码)可能是有益的。

【讨论】:

  • 当我更多地了解可以做许多不同事情的 Linqs 和 Lambda 表达式时,我变得越来越惊讶。您的示例是否可以与 TakeWhile() 相媲美?我以前用它来做数组比较。
  • @Shar1er80 相似之处在于它正在迭代枚举,是的 - 否则不同
猜你喜欢
  • 2019-01-14
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多