2012-04-02 1 views
0

Ich benutze C#, um eine Verbindung mit Excel über INTEROP.Schleife durch eine Spalte und Löschen von Zeilen, die nicht gehören

Wenn Sie INTEROP nicht kennen, sollte dies Sie nicht davon abhalten, diese Frage zu beantworten. Ich zerbreche mir Gehirn einen Algorithmus für das folgende versuchen herauszufinden:

Angenommen, ich habe eine Zeichenfolge string1="ALEX"

ich eine Liste haben:

AAAA 
ALEX 
ALEX 
LIZA 
LIZA 

oder die Liste kann sein:

ALEX 
ALEX 
ALEX 
LIZA 
NANCY 

Ich muss alle Vorkommen von Zeichenfolgen löschen, die NOT== ALEX

sind

Ich will nicht von einer, dies zu tun, weil es

viel zu lange dauert

die Liste immer sortiert ist, und ich will nur die Startpositionen und Endpositionen in der Liste der Zeichenfolge, die ich brauche, um zu loszuwerden

ich habe eine Schleife, die jede Zeile und innerhalb der Schleife durchläuft:

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

Dies ist gar nicht funktioniert. bitte hilfe! Ihre Anleitung kann in Bezug auf den einfachen Algorithmus oder den spezifischen Code, den ich verwenden kann

+0

bitte beachten Sie, dass, um alles zu löschen, ich einen RANGE geben muss, um zu löschen, anstatt Elemente einzeln zu löschen –

+0

WENN die Liste AAAA, ALEX, ALEX, LIZA ist, ist es in Ordnung, den ersten zu löschen und nur a Bereich von 1: 1, aber wenn es AAA, AAA, ALEX ist, dann muss ich 1: 2 löschen –

+0

Vielleicht bin ich ein Fehler, aber dieser Bereich überzeugt mich nicht. StartPos und EndPos sollen die Zeilennummern sein, oder? Und das gibt zum Beispiel einen get_Range ("A1: CO3")? Ist das ein gültiger Bereich? – Steve

Antwort

0

Wenn die Liste immer sortiert ist, verwenden Sie eine binäre Suche, um die Elemente in der Liste zu finden, die gelöscht werden sollen.

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

so viel vereinfacht! Wie kann ich eine binäre Sortierung verwenden, um Elemente zu löschen? –

+0

Die binäre Suche soll den Bereich der zu löschenden Zeilen finden. Sobald Sie den zu löschenden Bereich haben, verwenden Sie diesen Bereich zum Löschen. – saluce

+0

Genauer gesagt, sobald Sie eine Übereinstimmung mit der binären Suche treffen, gehen Sie Zeile für Zeile auf und ab, bis Sie keine Übereinstimmung mehr haben. Notieren Sie die Zeilennummer des ersten und letzten Elements und verwenden Sie diesen Bereich zum Löschen. – saluce

0

Übertragen Sie den Inhalt des Bereichs in ein zweidimensionales Array. Tun Sie die Arbeit gegen das Array (viel schneller). Übertragen Sie das Array dann zurück auf das Arbeitsblatt.

+0

Ich kann das nicht tun, da ich Excel-Formatierung behalten muss –

+0

Das sollte die Formatierung nicht beeinflussen ... – Dan