如何通过Linq识别List<Tuple<string,string>>中Item1的重复值?
用Linq找出重复目录对应的文件路径
完全可以通过Linq实现,核心思路是按目录名称分组,筛选出存在重复的分组,再提取对应文件路径,具体代码如下:
方法一:直接获取所有重复目录的文件项
// 示例集合 var fileList = new List<Tuple<string, string>> { Tuple.Create("Docs", @"C:\Files\Docs\file1.txt"), Tuple.Create("Pics", @"C:\Files\Pics\pic1.jpg"), Tuple.Create("Docs", @"C:\Files\Docs\file2.txt"), Tuple.Create("Videos", @"C:\Files\Videos\vid1.mp4"), Tuple.Create("Pics", @"C:\Files\Pics\pic2.png") }; // Linq查询:获取所有Item1重复的项 var duplicateItems = fileList .GroupBy(tuple => tuple.Item1) // 按目录名称分组 .Where(group => group.Count() > 1) // 只保留分组数量>1的(即重复目录) .SelectMany(group => group); // 展开分组,得到所有对应文件项 // 遍历处理 foreach (var item in duplicateItems) { Console.WriteLine($"目录: {item.Item1} | 文件路径: {item.Item2}"); }
方法二:先拿重复目录名,再关联文件路径
如果需要先单独拿到重复的目录名称,再匹配对应的文件,可以拆分两步:
// 第一步:提取所有重复的目录名称 var duplicateDirs = fileList .GroupBy(t => t.Item1) .Where(g => g.Count() > 1) .Select(g => g.Key); // 第二步:筛选出这些目录对应的所有文件路径 var duplicateFiles = fileList.Where(t => duplicateDirs.Contains(t.Item1));
代码说明
GroupBy:将集合按目录名称(Item1)归类,相同目录的项会被分到同一组Where(g => g.Count() > 1):过滤出元素数量大于1的分组,也就是存在多个文件的重复目录SelectMany:将分组中的所有元素展开为一个扁平集合,直接得到所有重复目录对应的文件项
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

