Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于c中列表中的子字符串匹配生成新列表_C#_List_Substring - Fatal编程技术网

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列表文件

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();
        }