如何从LINQ语句中显示Dictionary <string,string =“”>的结果值

时间:2017-12-27 23:29:03

标签: c# linq dictionary

我正在努力,无法显示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;`

我做错了什么?

2 个答案:

答案 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}");
}