我正在努力,无法显示results2
Dictionary<string, string> files
Dictionary<string, string> files = new Dictionary<string, string>();
foreach (var file in Directory.GetFiles(filepath + "\\Saved Pictures\\", "*.jpg"))
{
files.Add(file, CalculateHash(file));
}
var duplicates = files.GroupBy(item => item.Value).Where(group => group.Count() > 1);
var results2 = duplicates.Select(group => group.GroupBy(x => x.Value));
到目前为止,我已经尝试过:
foreach (KeyValuePair<string, string> result in results2)
{
Console.WriteLine("Key: {0}, Value: {1}", result.Key, result.Value);
}
我遇到了这条错误消息:
无法转换类型'System.Collections.Generic.IEnumerable&lt; System.Linq.IGrouping&lt; string,System.Collections.Generic.KeyValuePair&lt; string,string&gt;&gt;&gt;'到'System.Collections.Generic.KeyValuePair&lt; string,string&gt;`
我做错了什么?
答案 0 :(得分:2)
错误消息告诉您究竟出了什么问题。 results2
不是您在IEnumerable<KeyValuePair<string, string>>
循环中假设的foreach
,而是更复杂的类型,IEnumrable<IGrouping<string, KeyValuePair<string, string>>>
。
两个嵌套的foreach
循环将执行此操作:
foreach (var grouping in results2)
{
foreach (var pair in grouping)
{
// pair is a KeyValuePair<string, string>
}
}
答案 1 :(得分:0)
我越看这段代码,我就越不了解它。将已经分组的值按其最初分组的相同属性进行分组有什么意义?
简单地说,我怀疑你只是想获得具有相同哈希值的所有文件集的列表。一个简单的方法是:
var files = Directory.GetFiles(filepath + "\\Saved Pictures\\", "*.jpg");
// An enumerable of enumerables of files that share the same hash
var dupes = files.GroupBy(CalculateHash).Where(g => g.Count() > 1);
如果您需要将其展平以用于显示目的,您可以执行以下操作:
// IEnumerable<(string hash, string file)>
var flattened = dupes.SelectMany(grp => grp.Select(file => (hash: grp.Key, file)));
foreach ((var hash, var file) in flattened)
{
Console.WriteLine($"Key: {hash}, Value: {file}");
}