【问题标题】:vb.net get the *values* of the first and last lines of an arrayvb.net 获取数组的第一行和最后一行的 *values*
【发布时间】:2016-07-13 11:44:48
【问题描述】:

我有一个这样的数字数组:

{10 20 30 40 50 60 70 80 90}

开始和结束的数字并不总是相同的(事实上它们都不会相同)。

我想获取第一个和最后一个条目的(不是索引)。

所以在上面的例子中,我感兴趣的只是值“10”和“90”。

这个数组是由一个逗号分隔的文本文件构成的,看起来像这样:

10,3.456
20,3.588
30,3.640
40,3.790
50,3.850
60,3.680
70,3.480
80,3.280
90,3.765

这是我的代码:

    Dim arrName, arrValue As New List(Of String)()
    Dim sdata() As String
    Dim column1, column2 As Decimal

For Each line As String In IO.File.ReadAllLines("c:\file.txt")
    If line <> "" And Not line.StartsWith("#") Then
        sdata = line.Split(","c)
        arrName.Add(sdata(0).Trim())
        arrValue.Add(sdata(1).Trim())
        ' get data from array
        column1 = sdata(0)
        column2 = sdata(1)
End If
Next

所以我想要的是能够创建两个变量,其中:

column1Lowest=<the lowest value> (in this case 10)
column1Highest=<the highest value> (in this case 90)

我尝试了几种方法,但我似乎每次都返回整个数组,或“-1”(在我知道的数组中找不到匹配项)。

我尝试过的东西:IndexOf()、FirstIndexOf()、LastIndexOf()

我只对 column1 中的最低值和最高值感兴趣(但我仍然在其他地方使用其他值)。

我现在没有主意了。

请帮助 - 以新手可以理解的形式给出答案。

谢谢。

编辑:

为了在下面添加史蒂夫的答案,我尝试了 Inumerable strings 选项,但我相信我的文件格式遇到了问题 - 有些文件很好 - 有些不是(通常文件在最后一行数据之后没有换行符!)。

这是我的代码:

Dim Lines As Collections.Generic.IEnumerable(Of String) = File.ReadLines("c:\file.txt").Where(Function(q) q.StartsWith("#") = False)
        Line0 = Lines.FirstOrDefault
        LineN = Lines.LastOrDefault
       lowestNum = Line0.Split(New Char() {","c})
        highestNum = LineN.Split(New Char() {","c})
        lowNum = lowestNum(0)
        highNum = highestNum(0)

等等。

所以如果我想在我已经解析的文件上使用这段代码 - 我将如何使用现有的数组呢?

我刚试过:

Dim Lines As Collections.Generic.IEnumerable(Of String) = {column1}
                FirstValue = Lines.FirstOrDefault
                LastValue = Lines.LastOrDefault

但这仍然会打印整个数组?

显示我正在使用的输出:

    ListBox2.Items.Add(FirstValue)
    ListBox1.Items.Add(LastValue)

我尝试在“For Each”循环内外插入列表框代码。将它们放在外面会给我带来变量问题 - 所以我试图在循环之外声明变量无济于事。

我确实说过我是新手!

【问题讨论】:

    标签: arrays vb.net


    【解决方案1】:

    你可以使用这些漂亮的IEnumerable extensions

    Dim first = numbers.First()
    Dim last = numbers.Last()
    

    但是,如果您只想要数组的第一个和最后一个元素或数组中的最高和最低值,您的问题并不清楚。

    对于第二种情况

    Dim high = numbers.Max()
    Dim low = numbers.Min()
    

    我还注意到您使用字符串来管理这些值,但是如果它们是数字并且您想检索最高和最低数字,那么您绝对应该将这些值转换为整数,否则您将很难解释您的计算机上的字符串“100”高于字符串“20”。

    编辑
    循环遍历您的行并将每一行转换为小数,然后获取最小值和最大值 (注意,不检查输入的正确性)

    Dim names = new List(Of Decimal)()
    Dim values = new List(Of Decimal)()
    For Each line As String In IO.File.ReadAllLines("c:\file.txt")
        If line <> "" And Not line.StartsWith("#") Then
            sdata = line.Split(","c)
            names.Add(Convert.ToDecimal(sdata(0).Trim()))
            values.Add(Convert.ToDecimal(sdata(1).Trim()))
        End If
    Next
    Dim lowValue = names.Min()
    Dim highValue = names.Max()
    

    【讨论】:

    • 我已经在使用这个了,但是在读取文件时遇到了问题。所以我试图将它合并到我上面的循环中,但没有成功。我已经编辑了我原来的问题来说明这一点。
    • 史蒂夫,太好了,谢谢。我不得不切换值 名称并更正一两个错字!!但我猜你只是在测试我:-)
    【解决方案2】:

    试试这个来获取第一个和最后一个值:

    Dim FirstValue As String = sdata(0)
    Dim LastValue As String = sdata(sdata.Length - 1)
    

    【讨论】:

    • 你也可以使用Dim LastValue As String = sdata(Ubound(sdata))
    • @OSKM :但是UBound() 是一个过时的函数,它只存在于向后兼容。 navigator 的解决方案是当前的.NET 解决方案。
    【解决方案3】:

    列表或数组中的第一个元素总是索引为 0,最后一个元素 总是 List.Count - 1Array.Length - 1 取决于您使用的是数组还是列表。因此,您可以使用以下方法从数组中获取第一个和最后一个值:

    arrayLowest = arrayVariable(0)
    arrayHighest = arrayVariable(arrayVariable.Length - 1)
    listLowest = listVariable(0)
    listHighest = listVariable(listVariable.Count - 1)
    

    您提到的其他方法(IndexOf()FirstIndexOf()LastIndexOf())用于查找给定元素的索引。例如,如果您想知道元素 90 在列表/数组中的哪个位置,您可以使用这些。

    请注意,数组或列表默认不排序,因此如果您想从数组或列表中获取最小值和最大值,您需要使用史蒂夫提到的扩展,或者对列表/数组进行排序,然后获取第一个和最后一个值,或遍历列表/数组并执行比较。

    【讨论】:

      【解决方案4】:

      首先确保仅在数组大小 > 0 时才尝试访问元素,然后像这样访问第一个和最后一个元素:

      Dim lowest, highest As String;
      If arrValues.Length > 0 Then
        lowest = arrValues(0);
        highest = arrValues(arrValues.Length - 1);
      End If
      

      Array.Length 返回元素的数量,因为元素从 0 开始索引,最后一个元素将是 Length - 1

      【讨论】:

        猜你喜欢
        • 2014-11-10
        • 2014-09-29
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 2013-04-15
        • 1970-01-01
        • 2011-01-16
        相关资源
        最近更新 更多