我有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 ) );
感谢。
答案 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()