循环遍历列并删除不属于列的行

本文关键字:不属于 遍历 循环 删除 | 更新日期: 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);