删除相同的行

时间:2018-12-19 14:26:24

标签: c#

我有一个列表<>,其中包含从xlsx文档获得的IP地址。我需要同时删除工作表和Excel文件中的内容,并同时删除它们。 我使用以下代码执行此操作:

for (int i = 0; i < ip.Count; i++)
{
    for (int j = 0; j < ip.Count; j++)
    {
        if(j != i)              
        {
            if (ip[i] == ip[j])
            {
                ep.Workbook.Worksheets[1].DeleteRow(j + 1);
                ip.RemoveAt(j);
            }
        }
    }
}

它有效,但不会删除所有相同的地址。我们必须重新运行该文件,而他第二次已经清理了其余的重复项。如何使他立即清除所有相同的元素?我不明白我哪里错了。谢谢

2 个答案:

答案 0 :(得分:0)

代码的问题可能是,每当您从ip中删除某些内容时,索引就会移动,而在随后的每次删除中,您都不会删除您实际的想法。您必须独立进行此操作,而要遍历要更改的集合。此外,LINQ可能会帮助您以更优雅的方式获得所有重复项。

var duplicateRecords = ip
    // Preserve the original index within the collection
    .Select((x, i) => new { Ip = x, Index = i })
    .GroupBy(x => x.Ip)
     // Get only those records that repeat within the collection
    .Where(x => x.Count() > 1)
     // Skip the first record as we want to keep a single record of each duplicate group
    .SelectMany(x => x.Skip(1))
    .ToList();

foreach (var duplicate in duplicateRecords) {
  ep.Workbook.Worksheets[1].DeleteRow(duplicate.Index + 1);
  // Removing from the 'ip' list here is not an option as it would shift the indexes
}
ip = ip.Distinct().ToList();

答案 1 :(得分:0)

我会做这样的事情
注意WhateverTypeYourIpIs应该覆盖GetHashCodeEquals或向IEqualityComparer<WhateverTypeYourIpIs>提供HashSet

HashSet<WhateverTypeYourIpIs> hashSet = new HashSet<WhateverTypeYourIpIs>();
for(int i = 0; i < ip.Count;)
{
    if(hashSet.Contains(ip[i]))
    {
        ep.Workbook.Worksheets[1].DeleteRow(i + 1);
        ip.RemoveAt(i);
    }
    else
    {
        hashSet.Add(ip[i]);
        i++;
    }
}