I have a FileInfo
array with ~200.000 File Entries. I need to find all files which have the same filename. I need as result from every duplicate file the directory name and filename because I want to rename them afterwards.
What I've tried already:
Sounds like this should do it:
var duplicateNames = files.GroupBy(file => file.Name)
.Where(group => group.Count() > 1)
.Select(group => group.Key);
Now would be a very good time to learn LINQ. It's incredibly useful - time spent learning it (even just LINQ to Objects) will pay itself back really quickly.
EDIT: Okay, if you want the original FileInfo
for each group, just drop the select:
var duplicateGroups = files.GroupBy(file => file.Name)
.Where(group => group.Count() > 1);
// Replace with what you want to do
foreach (var group in duplicateGroups)
{
Console.WriteLine("Files with name {0}", group.Key);
foreach (var file in group)
{
Console.WriteLine(" {0}", file.FullName);
}
}
This should work:
HashSet<string> fileNamesSet = new HashSet<string>();
List<string> duplicates = new List<string>();
foreach(string fileName in fileNames)
{
if(fileNamesSet.Contains(fileName))
{
duplicates.Add(fileName);
}
else
{
fileNamesSet.Add(fileName);
}
}
Then duplicates will contain a list of all the duplicate filenames.
Note that since windows file names are case insensitive, you may wish to take this into account by converting all of the filenames to uppercase first using .ToUpperInvariant()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With