【问题标题】:Show Mulitple Files that Meet Criteria, But Select One of Them显示符合条件的多个字段,但选择其中一个
【发布时间】:2014-08-19 20:01:07
【问题描述】:

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

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 来匹配我的模式?

【问题讨论】:

  • 如果你在它的末尾加上一个ToArray(),你可以这样索引它。
  • @paqogomez - 这应该是答案,而不是评论。
  • 做到了。感谢您指出一个非常简单的解决方案!
  • @ErikPhilips:我不会推荐ElementAt(),除非你知道你只想要一个元素。与多次重新评估可枚举的风险相比,创建列表的开销通常微不足道。

标签: c# linq


【解决方案1】:

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

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

【讨论】:

  • 我选择了这个答案,尽管似乎有很多可能的解决方案。 .ElementAt 似乎不适用于可为空的 int,并且数组似乎总是不如列表灵活(对我来说,无论如何),所以我将使用一个列表。感谢所有快速回复。
  • @RicGaudet 为什么需要使用可为空的 int 进行索引 当您尝试获取 null 索引处的元素时,您期望什么行为?这没有任何意义。 PS。 ElementAt 和列表都不接受可以为空的 int 索引。
  • 我想这是真的。我使用 nullable int 只是因为我使用了一个表单来获得用户的响应,如果在选择选择之前关闭了表单,那就是你得到的(如果不是真的,请纠正我!)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2012-11-21
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多