2011-05-15 84 views
2

我需要比較兩個列表,其中每個列表包含大約60,000個對象。什麼是最有效的方式呢?我想選擇源列表中不存在於目標列表中的所有項目。比較兩個包含大量對象的列表

我正在創建一個同步應用程序,其中c#掃描目錄並將每個文件的屬性放入列表中。因此有一個源目錄列表和目標目錄的另一個列表。然後,而不是複製所有的文件,我只是比較列表,看看哪些是不同的。如果兩個列表都有相同的文件,那麼我不會複製該文件。這裏是我使用的Linq查詢,當我掃描一個小文件夾時它起作用,但當我掃描一個大文件夾時它不起作用。

// s.linst is the list of the source files 
// d.list is the list of the files contained in the destination folder 
    var q = from a in s.lstFiles 
     from b in d.lstFiles 
     where 
     a.compareName == b.compareName && 
     a.size == b.size && 
     a.dateCreated == b.dateCreated 
     select a; 

// create a list to hold the items that are the same later select the outer join 
List<Classes.MyPathInfo.MyFile> tempList = new List<Classes.MyPathInfo.MyFile>(); 

foreach (Classes.MyPathInfo.MyFile file in q) 
{ 
    tempList.Add(file); 
} 

我不知道爲什麼該查詢永遠。還有其他的事情,我可以利用。例如,我知道如果源文件與目標文件相匹配,則不可能對該文件進行其他重複,因爲不可能必須使用相同名稱和相同路徑來命名文件名。

回答

4

創建該類型的相等比較器,那麼你可以用它來有效地比較集:

public class MyFileComparer : IEqualityComparer<MyFile> { 

    public bool Equals(MyFile a, MyFile b) { 
    return 
     a.compareName == b.compareName && 
     a.size == b.size && 
     a.dateCreated == b.dateCreated; 
    } 

    public int GetHashCode(MyFile a) { 
    return 
    (a.compareName.GetHashCode() * 251 + a.size.GetHashCode()) * 251 + 
     a.dateCreated.GetHashCode(); 
    } 

} 

現在你可以使用這個與像Intersect方法來獲取存在於兩個列表中的所有項目,或Except獲取存在於一個列表中的所有項目,但不是其他:

List<MyFile> tempList = 
    s.lstFiles.Intersect(d.lstFiles, new MyFileComparer()).ToList(); 

由於方法可以使用的哈希碼的物品分爲水桶,還有少了很多的比較,需要比較做它有一個連接將一個列表中的所有項目與另一個列表中的所有項目進行比較。