Linq Match Array to List?

时间:2011-03-14 18:35:04

标签: c# linq

我有List<string>FileInfo[]。我需要知道FileInfo[]的所有内容是否都在List<string>中。什么是最LINQy和无错误的方法呢?

我这样做,根据这里的回复,它返回false,但我希望它返回true:

        // I want to know if all of these files are in the directory
        List<string> allFilesWanted = new List<string>();
        allFilesWanted.Add( "a1.txt" );
        allFilesWanted.Add( "a2.txt" );

        // Simulate a list of files obtained from the directory
        FileInfo[] someFiles = new FileInfo[3];
        someFiles[0] = new FileInfo("a1.txt");
        someFiles[1] = new FileInfo( "a2.txt" );
        someFiles[2] = new FileInfo( "notinlist.txt" );

        // This returns "false" when I would expect it to return "true"
        bool all = someFiles.All( fi => allFilesWanted.Contains<string>( fi.Name ) );

感谢。

3 个答案:

答案 0 :(得分:2)

使用您更新的问题:

var filenames=HashSet<string>(list);
fileInfoArray.All(fi=>filenames.Contains(fi.Name));

您可能需要将Name替换为FullName,具体取决于HashSet包含的内容。

存在区分大小写的问题。您可以在创建哈希集时提供自定义相等比较器,以实现不区分大小写的比较(例如StringComparer.InvariantCultureIgnoreCase)。问题是您无法知道文件名是否区分大小写。这取决于使用的文件系统。即使你知道它不区分大小写,用于不区分大小写的比较的语言环境也会有所不同。


或者只是与Linq:

!fileInfoArray.Select(fi=>fi.Name).Except(list).Any();

Except在内部使用HashSet,因此这是O(n)

答案 1 :(得分:1)

myFileInfoArray.All(fi => myList.Contains(fi));

答案 2 :(得分:1)

List<string> fileNames = ... 
FileInfo[] fileInfos = ...  

var missing = fileInfos.Except(fileNames);
var anyMissing = fileInfos.Except(fileNames).Any()