【问题标题】:looping through a column and deleting rows that do not belong遍历一列并删除不属于的行
【发布时间】:2012-04-02 21:10:58
【问题描述】:

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

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

【问题讨论】:

  • 请注意,为了删除任何内容,我需要给出一个删除范围,而不是一个一个地删除元素
  • 如果列表是 AAAA、ALEX、ALEX、LIZA,可以删除第一个并给出 1:1 的范围,但如果是 AAA、AAA、ALEX,那么我需要删除 1:2
  • 也许我错了,但这个范围并不能说服我。 startPos 和 endPos 应该是行号吧?例如,这给出了一个 get_Range("A1:CO3")?这是一个有效的范围吗?
  • 是的,这是一个有效范围,我只是简化了我的问题

标签: c# algorithm excel interop


【解决方案1】:

将范围的内容传输到二维数组。对数组进行操作(快得多)。然后将数组传回工作表。

【讨论】:

    【解决方案2】:

    如果列表总是排序的,则使用二分查找来查找列表中要删除的元素。

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

    【讨论】:

    • 非常感谢!如何使用二进制排序删除元素?
    • 二分查找是查找要删除的行的范围。有了要删除的范围后,请使用该范围进行删除。
    • 更具体地说,一旦您使用二分搜索找到匹配项,然后逐行上下移动,直到不再有匹配项。记录第一个和最后一个元素的行号,然后使用该范围进行删除。
    • 如果列表已排序,我将专注于查找您想要保留的元素的连续范围。然后根据此确定要删除的其他范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2010-09-23
    • 2022-01-15
    • 2016-05-27
    相关资源
    最近更新 更多