2012-12-24 208 views
1

這是代碼:如何檢查文件是否已經存在於列表中?

for (int i = 0; i < files.Count; i++) 
{ 
    if (pdf1.Lightnings.Count == 0) 
    { 
     pdf1.Lightnings.Add(files[i]); 
    } 
    if (files[i] != pdf1.Lightnings[i]) 
    { 
     pdf1.Lightnings.Add(files[i]); 
    } 
} 

兩個文件,閃電是List<string>

例如在文件中我有33個索引(文件名),我想將它們添加到列表閃電。 但我想檢查一下,如果文件列表中的文件名已經存在於閃電中,請不要再添加它。

現在是我得到錯誤的方式,因爲當變量i = 1,因此行:

if (files[i] != pdf1.Lightnings[i]) 

由於閃電我有引發錯誤只有一個索引[0]和在I = 1已經

回答

3

可以使用.Contains方法:

if (!pdf1.Lightnings.Contains(files[i])) 
    pdf1.Lightnings.Add(files[i]); 

這將檢查files[i]不集合中已經存在前加入。

+0

這是正確的答案! – JMK

+2

@JMK:還有很多其他的好答案。我不需要LINQ。 – mellamokb

1

你可以嘗試使用不同的屬性和foreach循環:

var count = 0; 
foreach(var file in files.Distinct()) 
{ 

    if (pdf1.Lightnings.Count == 0) 
    { 
     pdf1.Lightnings.Add(file); 
    } 
    if (files[i] != pdf1.Lightnings[count]) 
    { 
     pdf1.Lightnings.Add(file); 
    } 
    count++; 
} 
1
pdf1.Lightnings.AddRange(files.Distinct()); 

pdf1.Lightnings = pdf1.Lightnings.Union(files)); 
+0

這隻會在代碼被調用一次時起作用,如果該方法被多次調用相同的文件名會怎麼樣? – James

+0

@詹姆斯你是對的,但在問題中並不清楚,我認爲'閃電'最初是空的。 –

1

這可以很容易地使用LINQ來完成,這也將減少代碼量你需要寫例如

var itemsToAdd = files.Where(x => !pdf.Lightnings.Contains(x)); 
pdf.Lightnings.AddRange(itemsToAdd); 

即使一個行,如果你仍然覺得可讀

pdf.Lightnings.AddRange(files.Where(x => !pdf.Lightings.Contains(x))); 
1

至於答案的替代已經給出,如果希望項目的唯一列表,你可以使用HashSets代替。當然,HashSet是否比List更好取決於您的使用情況,但它保證了唯一的值。

相關問題