2014-01-30 210 views
0

我已浏览过上一篇文章,找不到解答此问题的文章。如果可能的话,请你指点我正确的方向。在2d字符串数组中查找重复的字符串

我正在使用MD5制作C#WPF文件重复查找程序,我将文件名和MD5哈希存储在二维数组中,这是最快的方式,我认为我可以实现这一点,但我有一个这个问题。

下面的代码是什么我试图做的事:

public void fileList(string filename) 
{ 
    string[,] fileLocationHash; 
    string[] files = Directory.GetFiles(filename, "*.*", 
     SearchOption.AllDirectories); 
    for (int i = 0; i < files.Length; i++) 
    { 
     FileStream file = new FileStream(files[i], FileMode.Open); 
     MD5 md5 = new MD5CryptoServiceProvider(); 
     byte[] retVal = md5.ComputeHash(file); 
     file.Close(); 

     StringBuilder sb = new StringBuilder(); 

     for (int x = 0; x < retVal.Length; x++) 
     { 
      sb.Append(retVal[x].ToString("x2")); 
     } 
     string fileHash = sb.ToString(); 
     // 2D array to compare hash and find duplicates 
     fileLocationHash = new string[,] 
     { 
      {files[i], fileHash} 
     }; 
     resultTextbox.Text = resultTextbox.Text 
      .Insert(resultTextbox.CaretIndex, fileHash + Environment.NewLine); 
     resultTextbox.Text = resultTextbox.Text 
      .Insert(resultTextbox.CaretIndex, files[i] + " - "); 
    } 
} 

我有实施的循环要经过二维数组的fileHash部分,并找到重复的问题。我不能看作是能够弄清楚如何选择阵列的第二部分,我认为以下将工作:

var duplicates = fileLocationHash[] 
     .GroupBy(g => g).Where(w => w.Count() > 1).Select(s => s.Key); 
foreach (var d in duplicates); 

但是这显示了fileLocationHash[]一个错误,我似乎无法理解我将如何保存和找到找到的文件的索引,这些文件将从2D数组的其他部分打印出文件的名称。

+2

边注:请使用自定义类,甚至'KeyValuePair <字符串,字符串>'使你的代码更易读... –

+0

你永远只能存储一个值在二维数组,究竟是什么你想在这里做什么? –

+0

我正在将文件名存储在一个部分中,并将md5哈希值存储在第二部分中。我试图循环遍历第二部分,找到重复的部分,然后我将显示数组第一部分的文件名的重复项。试图找到具有md5值的重复文件。 – MacKey

回答

0

所以它看起来像你试图将MD5哈希映射到该哈希文件列表。这可能是更好的直接表达,在数据strucutre:

var hashToFiles = new Dictionary<string, List<string>>(); 

现在处理新的文件时,你有hash + fileName - 这样你就可以检查它是否已经在地图上添加新的/更新现有条目:

if (hashToFiles.ContainsKey(hash)) 
{ 
    // add new entry 
    hashToFiles.Add(hash, new List<string>{fileName}); 
} 
else 
{ 
    hashToFiles[hash].Add(fileName); 
} 

所以地图建立唯一剩下的事情就是找到一个以上的元素

var keyValueForDups = hashToFiles.Where(item => item.Value.Length > 1); 

注意事项:

  • 使用SHA256比过时的MD5更好,但确定为您的目的
  • 在当前的代码,你每次都重新创建阵列,而不是使用列表,并追加到它
  • 使用自定义的类来保存{hash, fileName}对使代码可读性
+0

谢谢你的帮助。我现在知道了。 – MacKey