цикл по столбцу и удаление строк, которые не принадлежат - PullRequest
0 голосов
/ 03 апреля 2012

Я использую c # для подключения к Excel, используя INTEROP.

Если вы не знаете 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 голосов
/ 03 апреля 2012

Перенос содержимого диапазона в двумерный массив.Выполните работу с массивом ( намного быстрее ).Затем перенесите массив обратно на лист.

0 голосов
/ 03 апреля 2012

Если список всегда отсортирован, используйте двоичный поиск, чтобы найти элементы в списке, которые нужно удалить.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...