C# 基于c中列表中的子字符串匹配生成新列表
考虑一个包含以下内容的c列表文件C# 基于c中列表中的子字符串匹配生成新列表,c#,list,substring,C#,List,Substring,考虑一个包含以下内容的c列表文件 C:\z1\z1.docx C:\z1\z2.docx C:\z2\z2.docx // <--- file z2.docx has the same name as in folder z1. 我在问,因为用循环和其他低效的方式编写解决方案很容易,但我想使用一个优雅的解决方案,而且我对c语言中的列表操作的了解还不够。我不确定你认为循环低效的东西是什么——不管怎样,LINQ在封面下都会这么做。但如果您想使用LINQ,可以通过几个方法调用来实现: v
C:\z1\z1.docx
C:\z1\z2.docx
C:\z2\z2.docx // <--- file z2.docx has the same name as in folder z1.
我在问,因为用循环和其他低效的方式编写解决方案很容易,但我想使用一个优雅的解决方案,而且我对c语言中的列表操作的了解还不够。我不确定你认为循环低效的东西是什么——不管怎样,LINQ在封面下都会这么做。但如果您想使用LINQ,可以通过几个方法调用来实现:
var result = files.GroupBy(p => Path.GetFileName(p))
.Where(g => g.Count() > 1)
.SelectMany(g => g);
它将首先按文件名分组,丢弃仅有1个元素的所有组,并将其余组展平到单个路径集合中
您可以在SelectMany之后添加一个ToList调用,以将结果具体化到列表中。我不确定您认为循环的效率会有多低-无论如何,LINQ都会在封面下这样做。但如果您想使用LINQ,可以通过几个方法调用来实现:
var result = files.GroupBy(p => Path.GetFileName(p))
.Where(g => g.Count() > 1)
.SelectMany(g => g);
它将首先按文件名分组,丢弃仅有1个元素的所有组,并将其余组展平到单个路径集合中
您可以在SelectMany之后添加ToList调用,以将结果具体化到列表中。使用LINQ使用LINQDOWN投票者是否愿意发表评论?它根据样本输入/输出准确返回OP期望的结果。您想发表评论吗?它根据样本输入/输出准确返回OP期望的值。where duplicates.Containsfile始终为true,因为该文件从重复项中获取。对于所提供列表中包含的文件,它将为true。这是他的要求,也是优雅的。你的解决方案也很好。对不起,我想你误解了我。它总是正确的,因为您正在迭代列表中的元素,然后检查该元素是否存在于同一列表中。您刚刚从列表中获取了它,所以它必须在那里…重复的地方。Containsfile将始终为true,因为文件从重复的文件中获取。对于提供的列表中包含的文件,它将为true。这是他的要求,也是优雅的。你的解决方案也很好。对不起,我想你误解了我。它总是正确的,因为您正在迭代列表中的元素,然后检查该元素是否存在于同一列表中。你只是把它从列表中取出来,所以它必须在那里。。。
List<string> duplicates = new List<string>() { @"C:\z1\z1.docx",
@"C:\z1\z2.docx", @"C:\z2\z2.docx" };
List<dynamic> GetList(List<string> FilesToCheck)
{
var Files = from file in FilesToCheck
where duplicates.Contains(file)
select new { FileName = new FileInfo(file).Name, FullName
= new FileInfo(file).FullName };
return Files.ToList();
}