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

时间:2012-04-02 21:10:59

标签: c# algorithm excel interop

我使用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;
}

这根本不起作用。请帮忙!您的指导可以是简单算法或我可以使用的特定代码

2 个答案:

答案 0 :(得分:0)

如果列表始终排序,请使用二进制搜索来查找要删除的列表中的元素。

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);

答案 1 :(得分:0)

将范围的内容传输到二维数组。针对阵列进行工作(更快)。然后将数组传回工作表。