循环遍历列并删除不属于列的行
本文关键字:不属于 遍历 循环 删除 | 更新日期: 2023-09-27 18:29:43
我使用c#通过INTEROP连接到excel。
如果不知道INTEROP,这不应该阻止你回答这个问题。我绞尽脑汁想找出以下内容的算法:
假设我有一个字符串string1="ALEX"
我有一个清单:
AAAA
ALEX
ALEX
LIZA
LIZA
或者列表可以是:
ALEX
ALEX
ALEX
LIZA
NANCY
我需要删除所有出现的NOT== ALEX
字符串
我不想一个接一个地这样做,因为它需要太长的
列表总是排序的,我只想得到字符串列表中的开始位置和结束位置,我需要去掉
我有一个贯穿每一行和循环内部的循环:
if (cell.Value2.ToString()!= email && !foundStart) {
startpos = rCnt;
foundStart = true;
}
else if (cell.Value2.ToString() != email && foundStart) {
endPos = rCnt;
deleteRange = xlWorkSheet.get_Range("A" + startpos + ":" + "CO" + endPos, Type.Missing);
deleteRange = deleteRange.EntireRow;
deleteRange.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
foundStart = false;
}
这根本不起作用。请帮忙!你的指导可以是简单的算法或特定的代码,我可以使用
将范围的内容转移到二维数组中。对数组执行操作(要快得多)。然后将数组传输回工作表。
如果列表总是排序的,请使用二进制搜索来查找列表中要删除的元素。
function binarySearch (int lowRow, int highRow, int currentRow, string searchValue, string[] values) {
if values[currentRow] < searchValue
return binarySearch (lowRow, currentRow, (currentRow - lowRow) / 2, searchValue, values);
else if values[currentRow] > searchValue
return binarySearch (currentRow, highRow, (highRow - currentRow) / 2, searchValue, values);
else
return currentRow;
}
var searchTerm = "ALEX";
var foundRow = binarySearch(1, listFromExcel.RowCount, listFromExcel.RowCount/2, searchTerm, listFromExcel);
var lowRow = foundRow;
var highRow = foundRow;
while (listFromExcel[lowRow] == searchTerm)
lowRow--;
lowRow++;
while (listFromExcel[highRow] == searchTerm)
highRow++;
highRow++;
listFromExcel.DeleteRange(lowRow, highRow);