2014-10-16 75 views
2
public class Part 
{ 
    public String VendorId { get; set; } 
    public String VendorPart { get; set; } 
    public String BasePart { get; set; } 
    public String Description { get; set; } 
    public ImageViewType View { get; set; } 
} 

private List<Part> partList = null; 

private bool deleteOldFile = false; 

我很好奇,爲什麼下面的代碼工作的布爾聲明(一旦partList加載數據):在需要額外的括號

foreach (Part p in partList) 
{ 
    deleteOldFile = ((partList.Last().BasePart) == (p.BasePart)); 
    MoveFile(FileType.Image, p, GetSetImageFile(imageBox1, currentFile)); 
} 

及以下不工作(不落布爾deleteOldFile到true):

foreach (Part p in partList) 
{ 
    deleteOldFile = (partList.Last().BasePart == p.BasePart); 
    MoveFile(FileType.Image, p, GetSetImageFile(imageBox1, currentFile)); 
} 
+0

請提供一個簡短但完整的程序來展示問題。你甚至不需要你在那裏的括號 - 它應該是'deleteOldFile = partList.Last()。BasePart == p.BasePart;'。請注意,循環後面的'deleteOldFile'的值只會是最後一次迭代的結果*,因爲您只是在每次迭代時覆蓋變量。那是故意的嗎? – 2014-10-16 16:10:26

+0

在附註中,調用'foreach'中的'partList.Last()'將導致列表在每次迭代中枚舉。在循環外部創建'var lastPart = partList.Last()。BasePart;'可能會更好。 – valverij 2014-10-16 16:21:49

+0

欣賞評論。目的是僅在最後一次迭代中將該值設置爲true。該程序旨在將單個文件複製到單獨文件夾中的多個獨特文件名。在最後一個副本上,舊文件被刪除。對不起,沒有解釋意圖或包括更多的程序。我只是想明白爲什麼第一個例子工作正常,但第二個例子沒有。 – 2014-10-16 17:31:42

回答

1

這兩個選項沒有區別。您的問題的原因可能是因爲您每次迭代都會覆蓋deleteOldFile的值。我想你想寫這樣的:

foreach (Part p in partList) 
{ 
    deleteOldFile = deleteOldFile || partList.Last().BasePart == p.BasePart; 
    MoveFile(FileType.Image, p, GetSetImageFile(imageBox1, currentFile)); 
} 
1

你在列表ebvery項重置deleteOldFile

,如果你想DELETEFILE如果任何產品一樣的最後一個項目,(除了最後一個項目本身,當然,這將永遠是相同的本身),然後更改爲:

var deleteFile = false; 
    var last = partList.Last(); 
    foreach (Part p in partList) 
     if (p.Equals(last) || deleteOldFile = (p.BasePart == last.BasePart)) 
      break;