显示符合条件的多个文件,但选择其中一个

时间:2014-08-19 20:01:07

标签: c# linq

尝试收集符合特定条件的一系列文件名,然后将该集合传递给用户以选择正确的文件名。没问题,除非我试图实际访问所选的特定文件。

string URL = "whateverPath";
string filename = "whateverFileName";
string pattern = @"\\" + filename + @"N?\..{3}";
IEnumerable<string> files = Directory.EnumerateFiles(URL).
    Where(path => Regex.Match(path, pattern, RegexOptions.IgnoreCase).Success);

这给了我一组文件,但是我不允许选择文件[2],例如,因为IEnumerable的构造方式(听说过一个无法通过索引访问的可枚举的人) ? - 有点让它......不可枚举!)

因此,当我尝试使用返回字符串数组的Directory.GetFiles方法时,我突然不允许使用Linq模式匹配快捷方式,因为它只返回一个IEnumerable。

string[] files = Directory.GetFiles(URL).
Where(path => Regex.Match(path, pattern, RegexOptions.IgnoreCase).Success);

这不会编译。

有没有简单的方法从IEnumerable获取索引号,或者使用Linq来匹配我的模式?

2 个答案:

答案 0 :(得分:4)

System.Linq包含IEnumerableToList()的扩展方法。所以只需添加.ToList()

IList<string> files = Directory.EnumerateFiles(URL)
    .Where(path => Regex.Match(path, pattern, RegexOptions.IgnoreCase).Success)
    .ToList();

答案 1 :(得分:1)

每个LINQ扩展方法都适用于IEnumerable并返回IEnumerable。此接口没有索引器。您可以使用扩展方法ElementAt(index)获取特定索引处的元素。这将枚举集合,直到达到指定的索引并返回元素。

其他方法可以通过扩展方法ToList()ToArray()将您的集合转换为列表或数组,然后使用它们的索引器,但这将继续整个集合并将其转换为列表/数组,这可以慢一点。