2012-04-02 4 views
0

私はINTEROPを使用してExcelに接続するためにC#を使用しています。列をループして属していない行を削除する

もしINTEROPを知らないのなら、これはあなたがこの質問に答えるのを止めるべきではありません。私は次のためのアルゴリズムを把握しようとしている私の脳をラッキングしています:

は、私がリストを持っている私は、文字列にstring1="ALEX"

があるとします。

AAAA 
ALEX 
ALEX 
LIZA 
LIZA 

またはリストを指定できます

ALEX 
ALEX 
ALEX 
LIZA 
NANCY 

すべての文字列を削除する必要があります。NOT== ALEX

これは長すぎるので、これを1つずつ実行したくないです

リストは常にソートされています。私は取得する必要がある文字列のリストで開始位置と終了位置を取得したいこれがまったく機能していない

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

を取り除く私はすべての行を通って、ループの内部に入るループを持っています。助けてください!あなたのガイダンスは、単純なアルゴリズムまたはリストが常にソートされている場合、私は削除するリストの要素を見つけるためにバイナリ検索を使用し、

+0

リストはAAAA、ALEX、ALEX、LIZAある場合は、最初のものを削除し、ちょうど与えることで結構です何かを削除するために、私は削除するRANGEを与える必要があることに注意してください代わりの1 –

+0

によって要素の1を削除してください1:1の範囲ですが、AAA、AAA、ALEXの場合は1:2を削除する必要があります –

+0

おそらく私は間違いですが、その範囲は私には納得できません。 startPosとendPosは右の行番号であるはずですか?そして、これは、例えば、get_Range( "A1:CO3")?これは有効な範囲ですか? – Steve

答えて

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

ありがとう!バイナリソートを使って要素を削除するにはどうすればいいですか? –

+0

バイナリ検索では、削除する行の範囲を検索します。削除する範囲が決まったら、その範囲を削除に使用します。あなたはバイナリサーチで試合を打ったら、あなたは、もはや試合を持たなくなるまで – saluce

+0

具体的には、その後、上下に一行ずつ行きます。最初と最後の要素の行番号を記録し、その範囲を削除に使用します。 – saluce

0

範囲の内容を2次元配列に転送します。配列に対して作業を行う(ははるかに速く)。その後、配列をワークシートに戻して転送します。

+0

私はExcelのフォーマット –

+0

を保持する必要があるため、フォーマットに影響を与えてはならないことがあることを行うことができません... – Dan

関連する問題