我有一个列表<>,其中包含从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);
}
}
}
}
它有效,但不会删除所有相同的地址。我们必须重新运行该文件,而他第二次已经清理了其余的重复项。如何使他立即清除所有相同的元素?我不明白我哪里错了。谢谢
答案 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
应该覆盖GetHashCode
和Equals
或向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++;
}
}