2017-04-09 78 views
0

我有一個C#程序,它從指定目錄中的指定服務器獲取所有文件。這將生成FileInfo對象的集合。我想按名稱對這個FileInfo對象進行分組,然後查詢結果以確定組中的所有文件是否具有相同的版本。如果他們這樣做,我不想知道,如果他們不知道,我想要返回不匹配的fileInfo對象以便我可以報告它。查詢一組FileInfo對象

var Files = listOfMachines.SelectMany(m => m.Files).GroupBy(f => f.Name); 

foreach (IGrouping<string, FileInfo> group in files) 
       { 
        //Need logic here to return a fileinfo object that doesnt match the rest of the fileinfo objects versions in the group. 
        // If they do match, continue 
       } 
+1

你使用哪種屬性來獲取文件版本,如果有兩個設置在一組給定的文件版本,你將如何驗證,這是一個正確的組,它可以假定更高的數字是正確的版本 –

回答

0

你需要下面的代碼基於一定的假設:

詳情:

  1. resultDictionary是最終的結果包含文件名作爲鍵和IEnumerable<FileInfo>作爲價值
  2. foreach循環,以下是重要步驟。
  3. 集團通過FileVersionInfo使用FileVersionInfo.GetVersionInfoCount爲分組值,然後由數下令原集團,計算
  4. 如果Count > 1然後有一個版本不匹配,那麼相關的詳細信息添加到resultDictionary,這將是最後的一系列細節

    var resultDictionary = new Dictionary<string, IEnumerable<FileInfo>>(); 
    
    foreach (IGrouping<string, FileInfo> group in files) 
    { 
    
    var fileVersionInfoGrouping = group.GroupBy(grp => FileVersionInfo.GetVersionInfo(grp.FullName),new FileVersionInfoComparer()) 
                .OrderBy(grp => grp.Count()); 
    
    IGrouping<FileVersionInfo,FileInfo> fileVersionInfoGroupingFirst = null; 
    
    if(fileVersionInfoGrouping.Count() > 1) 
        fileVersionInfoGroupingFirst = fileVersionInfoGrouping.First(); 
    
    if(fileVersionInfoGroupingFirst != null) 
        resultDictionary.Add(group.Key,fileVersionInfoGroupingFirst.Select(fInfo => fInfo));   
    } 
    

編輯1:

添加FileVersionInfo平等比較器,同時創建fileVersionInfoGrouping,目前它已完成FileVersion屬性,但可以擴展其他各種屬性,這對於類/引用類型很重要。 EqualityComparer實現方法GetHashCodeEquals

public class FileVersionInfoComparer : IEqualityComparer<FileVersionInfo> 
{ 
    public bool Equals(FileVersionInfo file1, FileVersionInfo file2) { return file1.FileVersion == file2.FileVersion; } 

    public int GetHashCode(FileVersionInfo obj) { return obj.FileVersion.GetHashCode(); } 

}