【问题标题】:LINQ VB.Net variable not declared errorLINQ VB.Net 变量未声明错误
【发布时间】:2012-05-24 22:40:47
【问题描述】:

我正在尝试运行这行代码:

Dim OrderedFiles() As String = Directory.GetFiles(FilePath).OrderBy(x >= x.CreationTime)

我在 x 上收到一个错误,说 x 未声明。

我的项目设置为 Option Strict Off 和 Option Infer On。如果我打开 Option Strict,那么我会从项目中得到数千个错误(它是继承的),我没有时间修复所有这些错误,但是 x 不再给我一个错误。我已经用谷歌搜索了,直到我想把我的电脑扔出窗外。

任何有关如何更正此声明的帮助将不胜感激。

编辑:

我希望有一个更优雅的解决方案,但这是我想出的解决这个特殊问题的方法。

    Dim fileList() As String = Directory.GetFiles(FilePath)
    Dim fileDate(fileList.Length - 1) As DateTime

    For i As Integer = 0 To fileList.Length - 1
        fileDate(i) = New FileInfo(fileList(i)).CreationTime
    Next

    Array.Sort(fileDate, fileList)

    With EmailTemplates_DropDownList
        .DataSource = fileList.Reverse.Take(5)
        .DataBind()
    End With

它不是特别优雅,但可以完成工作。我希望有一个单线 LINQ 解决方案,但我只是没有 LINQ 的背景,不知道如何完成这项工作,是时候去买一本书了。

【问题讨论】:

    标签: vb.net linq


    【解决方案1】:

    我不确定你从哪里得到这个语法:

    OrderBy(x >= x.CreationTime)
    

    几乎看起来像

    的C#语法
    OrderBy(x => x.CreationTime)
    

    但我相信你会使用 VB

    OrderBy(Function(x) x.CreationTime)
    

    这肯定是Enumerable.OrderBy 中的示例所暗示的。

    编辑:那时你会得到一个不同的错误,根据史蒂夫的帖子......但他没有更正语法。我怀疑你想要:

    Dim OrderedFiles() As FileInfo = new DirectoryInfo(FilePath).GetFiles(). 
                                            OrderBy(Function(x) x.CreationTime).
                                            ToArray()
    

    【讨论】:

    • @Steve:“不起作用”对错误的描述不是很有帮助。我现在要睡觉了,但请在以后提供更多信息。
    • VB.net 有 LINQPad 版本吗?我能找到的所有示例和书籍都是用 C# 编写的,我不想学习并且尝试将示例转换为 vb 是一种痛苦。
    • @JonSkeet 对,现在只是在 linqpad 上测试并给出 Impossible to convert the value of type 'System.Linq.IOrderedEnumerable(Of System.IO.FileInfo)' in 'Matrix 1 dimension of String.'.(只是意大利语的粗略翻译)
    • @Varuuknahl 当前版本的 linqpad 也允许 VB.Net 语法
    • @JonSkeet 明白了。 OrderedFiles 是否为 String
    【解决方案2】:

    Directory.GetFiles() 返回指定目录中的文件名(包括它们的路径)。 不能使用 x.CreationTime,x 是字符串

    也许你应该使用 DirectoryInfo

    Dim di as DirectoryInfo = new DirectoryInfo(FilePath)
    Dim OrderedFiles = di.GetFiles().OrderBy(Function(x) x.CreationTime).Take(3)
    Dim fi as FileInfo
    For each fi in OrderedFiles
        Console.WriteLine(fi.FullName)
    Next
    

    【讨论】:

    • 我尝试使用这种方法,但我需要路径信息。有没有办法通过 CreationTime 对 Directory.GetFiles 进行排序,而不通过多个数组,更糟糕的是我只需要最后创建的 n 个文件。我放弃了让 Take(n) 工作的尝试。
    • 我也试过:Dim eFileList = (From File In Directory.EnumerateFiles(FilePath) Order By File.CreationTime).Take(3),但正如你所说,我得到 CreationTime 不是字符串。
    • 更新了答案。你得到一个有序的 FileInfo 集合,这里有 FullName 和 DirectoryName 属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2020-05-12
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多