C# C-查找特定值在列表中是否有重复项

C# C-查找特定值在列表中是否有重复项,c#,list,duplicates,C#,List,Duplicates,我有一个用例,给定一个巨大的字符串列表和一个从DataGridView行中提取的特定字符串值,该行包含相同顺序的元素,我需要找到该列表是否包含另一个相同的条目。我检查过的所有现有帖子都会告诉你是否有重复。以下是我到目前为止的情况: List<int> indexes = new List<int>{-1, originalRow.Index}; int foundIndex = CompleteScancodeList.IndexOf(originalRow.Cells

我有一个用例,给定一个巨大的字符串列表和一个从DataGridView行中提取的特定字符串值,该行包含相同顺序的元素,我需要找到该列表是否包含另一个相同的条目。我检查过的所有现有帖子都会告诉你是否有重复。以下是我到目前为止的情况:

List<int> indexes = new List<int>{-1, originalRow.Index};

int foundIndex = CompleteScancodeList.IndexOf(originalRow.Cells[1].Value.ToString());

if (!indexes.Contains(foundIndex))
{
    //Do something
}
originalRow变量是一个DataGridViewRow,它通过迭代DataGridView的每一行来提取。我在这里实际上是在说:如果列表中该元素的索引不是-1,并且与行的索引不是同一个索引,那么实际上是同一个元素

我最初设法使它与嵌套循环一起工作,但它太慢了,我不喜欢。如果给定的字符串值存在于字符串列表中,但索引与原始索引不同,那么该条件的计算结果将仅为true,我如何才能使其按我所希望的方式工作

这很管用,有点。。。仅当复制的元素在列表中的原始元素之前时,此选项才有效。类似地,如果使用LastIndexOf方法,则仅当复制的元素在后面时才有效。

//搜索第一个元素的索引 int foundIndex=CompleteScancodeList.IndexOforiginalRow.Cells[1].Value.ToString; //如果找到的索引是行的索引 iffoundIndex==原始行索引 //搜索下一个元素的索引 foundIndex=CompleteCanCodeList.IndexForiginalRow.Cells[1].Value.ToString,originalRow.Index+1; //如果发现了什么 如果找到索引!=-1. { //做点什么 } 具有显式循环的其他解决方案:

var hasDuplicate = false;
var index = 0;
foreach(var element in CompleteScancodeList)
{
    if(element == originalRow.Cells[1].Value.ToString() && index != originalRow.Index)
    {
        hasDuplicate = true;
        break;
    }
    index++;
}

if (hasDuplicate)
{
    //Do something
}


这是一个如何在列表中查找重复编号并将从第一个列表中选择的唯一值存储到第二个列表中的示例

            List<int> LST = new List<int> { 10, 34, 43, 75, 10, 67, 30, 200, 30, 100, 30 };
        List<int> LST_2 = new List<int>();

        for (int i = 0; i < LST.Count; i++)
        {
            for (int j = i + 1; j < LST.Count; j++)
            {
                if (LST[j] == LST[i])
                {

                    if (!LST_2.Contains(LST[i]))
                    {
                        LST_2.Add(LST[i]);
                    }

                }
            }
        }

        foreach (var N in LST_2)
        {
            Console.WriteLine(N);
        }

我希望这能帮助您

一旦您有了要搜索的值的第一个索引:

string searchedValue = originalRow.Cells[1].Value.ToString();
int foundIndex = CompleteScancodeList.IndexOf(searchedValue);
可以使用linq.Skip方法仅获取其余元素。然后使用.Any,一旦满足条件,它将停止执行

CompleteScancodeList.Skip(foundIndex).Any(entry => entry == searchedValue);

但它仍在重复两次,一次用于IndexOf,一次用于Any。

我来自phone,很抱歉格式和打字错误太糟糕了。因此,请告知列表中是否有重复项:

if (list.Count != list.Distinct().Count) { // list has dupes }
查找并处理特定的重复项:

var set = new HasSet<int>();
foreach (var item in list) {
    if (!set.Add(item)) {
        // handle it
    }
}

如果需要数组中的实际索引,可以将foreach替换为for循环。

为什么需要嵌套循环?扫描列表,直到找到第二个有问题的值,或者用尽列表:一个循环。您的方法通常是可以的,但不是有效的。用任何类型的ISet替换列表,比如说,HashSet就可以了。然后您的循环条件将是if indexes.AddfoundIndex//这是一个重复。我找到了一种简单的方法:if completeCancodelist.FindAll entry=>entry.equalOriginalRow.Cells[1]。Value.ToString.Count>1。换句话说,如果FindAll方法搜索有问题的值时返回一个大于1的数组,那么它就有一个重复的数组。“这是一个好方法吗?”马丁·奥普要求找到某个重复的物品并以某种方式加以处理。至少,我是这样理解的。我是OP:P。我最终想处理它是的,但现在我只需要知道在不同的索引中是否存在重复的元素。我想到了这一点,但最终运行了两次IndexOf。在包含50000个项目的列表中,花费的时间太长。第二个索引从第一个停止的位置开始。向下投票,因为此解决方案在^2上的性能很差。可以将其减少为打开。但此解决方案不会扫描整个列表两次。因此,我想应该是在On和On^2之间吧?我会使用OP提供的解决方案,通过将列表与集合一起更改。它足够短,足够快。这正是我的第一个方法,但如果可能的话,我想加快速度。它总是包含它,它包含与表相同的元素。我需要看看它是否包含两次。这是有希望的!等等我认为这里的所有答案都是一样的,只是使用linq或显式循环。我想它需要做基准测试,看看什么最有效。这个方法不能保证从IndexOf返回的foundIndex是表中我的行的索引,对吗?