2011-09-07 110 views
0

我保存在一個列表文件的末尾每行一個文件...檢查比賽

但是我希望做的是檢查,如果該文件已經包含了行,以便它不保存同一條線兩次。

因此,使用StreamWriter寫入文件之前,我想檢查每個項目列表中,看它是否在文件中存在。如果是這樣,我想在使用StreamWriter之前從列表中刪除它。

.....除非有更好的方法去做這件事嗎?

+0

是否有最大數量的行,或者它是完全開放式的,文件可以隨意增長? –

+0

@ Neil Fenwick:它是開放式的: -/ – theNoobGuy

回答

1

假設你的文件很小,而且你被限制爲平面文件加一個數據庫表不是一個選項等,那麼你可以將現有的項目讀入一個列表,然後根據寫入操作條件在檢查名單...再次,我會盡可能嘗試另一種方法(分貝表等),但只是最直接的回答你的問題...

string line = "your line to append"; 

// Read existing lines into list 
List<string> existItems = new List<string>(); 
    using (StreamReader sr = new StreamReader(path)) 
     while (!sr.EndOfStream) 
      existItems.Add(sr.ReadLine()); 

// Conditional write new line to file 
if (existItems.Contains(line)) 
    using (StreamWriter sw = new StreamWriter(path)) 
     sw.WriteLine(line); 
1

我想你可以做的是從文件初始化列表,將每行添加爲列表中的新條目。

然後,當您添加到列表中時,請檢查它是否已包含該行。

List<string> l = new List<string>{"A", "B", "C"}; //This would be initialized from the file. 
    string s; 
    if(!l.Contains(s)) 
     l.Add(s); 

當您準備保存文件時,只需寫出列表中的內容即可。

+0

如果文件是10或100的MB,該怎麼辦? –

0

這會很慢,特別是如果你有很多數據進入表格。

如果可能,是否可以在文本列上使用主鍵將所有行存儲在數據庫表中?然後添加如果列值不存在,並且當你完成後,將錶轉儲到文本文件?我想這就是我要做的。

我想指出,我不認爲這是理想的,但它應該是相當高性能(使用MSSQL語法):

create table foo (
    rowdata varchar(1000) primary key 
    ); 

-- for insertion (where @rowdata is new text line): 

insert into foo (rowdata) 
select @rowdata 
where not exists(select 1 from foo where rowdata = @rowdata) 

-- for output 
select rowdata from foo; 
+0

因此,您應該檢查文本中的某一列以查看該列是否已經存在?你能解釋一下你的意思嗎?也許僞代碼/代碼來幫助證明? – theNoobGuy

0

如果你可以將它保存在文件中的每個時間排序確定一個特定條目是否存在會快得多。

另外一個數據庫表將是一個好主意,因爲您可以搜索要添加到表中的條目,並且如果它不存在,請添加它。

它,如果你是速度(DB),快速執行(文件訪問)後或不關心取決於(直到文件變得太大和燒傷和崩潰在內存列表中使用。)

類似大小寫可以發現here