2016-07-13 3 views
1

ich eine Reihe von Zahlen wie diese haben:vb.net die * Werte erhalten * der ersten und letzten Zeilen eines Arrays

{10 20 30 40 50 60 70 80 90} 

Die Start- und End-Zahlen wird die gleiche nicht immer (in der Tat keiner von ihnen wird).

Ich möchte den Wert (nicht den Index) der ersten und letzten Einträge erhalten.

Also im obigen Beispiel interessiert mich nur die Werte "10" und "90".

Dieses Array von einer Komma getrennte Textdatei aufgebaut wird, die wie folgt aussieht:

mein Code Dies ist
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 

:

zwei
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 

Also, was ich will, ist in der Lage zu schaffen, Variablen wo:

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

Ich habe mehrere Methoden ausprobiert, aber alles, was ich zurück zu bekommen scheint, ist das ent Ire Array jedes Mal, oder "-1" (keine Übereinstimmung gefunden in Array ich weiß).

Dinge, die ich versucht habe: IndexOf(), FirstIndexOf(), LastIndexOf()

Ich bin nur daran interessiert, den niedrigsten eines höchsten Wert in column1 (aber ich habe noch den Rest an anderer Stelle verwenden).

Ich bin jetzt aus Ideen.

Bitte helfen - mit Antworten in der Form, die ein Neuling verstehen kann.

Danke.

EDIT:

unten an Steves Antwort hinzuzufügen, habe ich versucht, die enumerable Option Strings aber ich glaube, ich war in Probleme mit meinem Dateiformat laufen - einige Dateien waren in Ordnung - einige waren nicht (in der Regel eine Linie Dateien ohne Feed nach der letzten Zeile der Daten!).

Dies ist mein Code:

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) 

etc ..

Also, wenn ich dieses Stück Code auf meiner bereits analysierten Datei verwenden wollte - wie würde ich das bestehende Array mit ihm verwenden?

Ich habe gerade versucht:

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

Aber diese druckt noch das gesamte Array?

der Ausgabe angezeigt Ich verwende:

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

ich den listbox Einfügen von Code sowohl in als auch außerhalb der „For Each“ Schleife versucht haben. Wenn ich sie nach draußen bringe, ergeben sich verschiedene Probleme - daher habe ich versucht, die Variablen außerhalb der Schleife ohne Erfolg zu deklarieren.

Ich habe gesagt, ich war ein Neuling!

Antwort

5

Es gibt diese hübsche IEnumerable extensions, die Sie

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

jedoch aus Ihrer Frage nicht klar verwenden können, ist, wenn man nur das erste und das letzte Element des Arrays oder dem höchsten und dem niedrigsten Wert im Array wollen.

Für den zweiten Fall haben Sie

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

Ich habe auch bemerkt, dass Sie Zeichenfolgen verwenden, um diese Werte zu verwalten, aber wenn sie Zahlen sind, und Sie möchten die höchsten und niedrigsten Nummern abrufen, dann sollten Sie unbedingt konvertieren Diese Werte sind ganzzahlig, sonst haben Sie Schwierigkeiten, Ihrem Computer zu erklären, dass eine Zeichenfolge "100" höher als eine Zeichenfolge "20" ist.

EDIT
Schleife über Ihre Zeilen und jede Zeile in eine Dezimalzahl umwandeln dann die min erhalten und max (Hinweis, keine Prüfung auf die Richtigkeit der Eingabe)

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() 
+0

Ich habe dies bereits verwendet, aber ich stieß auf Probleme beim Lesen von Dateien. Also habe ich versucht, es ohne Erfolg in meine Schleife oben zu integrieren. Ich habe meine ursprüngliche Frage bearbeiten, um dies zu veranschaulichen. – Tony

+1

Steve, das ist perfekt, danke. Ich musste Werte <> Namen wechseln und einen Tippfehler korrigieren! Aber ich glaube, Sie haben mich gerade getestet :-) – Tony

+0

Fühlen Sie sich frei, die Antwort zu bearbeiten, um die Tippfehler zu beheben – Steve

1

Das erste Element in einer Liste oder Array immer hat Index 0 und das letzte Element immerList.Count - 1 oder Array.Length - 1 je nachdem, ob Sie einen Array oder eine Liste verwenden. So ermitteln Sie den ersten und den letzten Wert aus dem Array erhalten mit:

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

Die anderen Methoden, die Sie erwähnen (IndexOf(), FirstIndexOf(), LastIndexOf()) verwendet, um den Index eines bestimmten Elements zu finden. Wenn Sie beispielsweise wissen möchten, an welcher Position sich das Element 90 in der Liste/dem Array befindet, würden Sie diese verwenden.

Bitte beachten Sie, dass ein Array oder eine Liste nicht standardmäßig sortiert ist. Wenn Sie also die minimalen und maximalen Werte von Ihrem Array oder Ihrer Liste abrufen möchten, müssen Sie entweder die von Steve erwähnten Erweiterungen verwenden oder die Liste/Array sortieren Rufen Sie dann den ersten und letzten Wert ab, oder führen Sie eine Schleife über die Liste/das Array und führen Sie Vergleiche durch.

1

dieses Versuchen Sie, die ersten und letzten Werte:

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

Sie können auch 'Dim LastValue als String = sdata (Ubound (sdata))' – OSKM

+2

@OSKM: Allerdings 'UBound() 'ist eine veraltete Funktion, die nur für Rückwärtskompatibilität existiert. Die Lösung von Navigator ist die aktuelle .NET-Lösung. –

0

zunächst sicherstellen, dass Sie nur die Elemente zuzugreifen versuchen, wenn das Array mit einer Größe> 0 hat, greifen dann die erste und die letzte Element wie folgt:

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

Array.length die Anzahl der Elemente zurückgibt, als Elemente indexiert werden von 0 beginnend, wird das letzte Element Length - 1 sein.

Verwandte Themen