2017-07-20 9 views
1

Ich glaube, das ist sehr ähnlich zu this, aber ich brauche dies auf der Grundlage gleicher Indizes.Aktualisieren einer Liste aus einer anderen Liste basierend auf Index (Zeilennummer)


Ich habe eine Liste wie folgt aus:

Time | Temp1 | Temp2 | Type 

10:42:00 | 108 | 150 | Unkwon 

10:44:00 | 107 | 160 | Test 

10:46:00 | 108 | 130 | Test22 

Ich habe eine andere wie folgt aus:

ID | Type 

40 | New1 

80 | New2 

100 | Test22 

Ich habe kein Feld beide Listen zu vergleichen haben. Aus diesem Grund möchte ich den Index (Zeilennummer) der Liste und <> Typ verwenden.

So

Zeile 1 und 2 sollten aktualisiert werden, da sie unterschiedliche Art präsentieren.


Erwartetes Ergebnis:

Time | Temp1 | Temp2 | Type 

10:42:00 | 108 | 150 | New1 

10:44:00 | 107 | 160 | New2 

10:46:00 | 108 | 130 | Test22 

Was habe ich:

foreach (var x in Graph._listData) 
{ 
    var itemToChange = newData2 
     .First(d => 
      d[newData2.IndexOf(1)] == Graph._listData.IndexOf(1)).Type = x.Type; 
} 

Ich glaube, dass die ganze Idee von diesem Code falsch ist, aber es, was ich an dieser bekam Punkt.

Die Struktur meiner Tabellen:

public struct GraphData 
{ 
    public double Temp1; 
    public double Temp2; 
    public DateTime Date; 
    public string Type; 
} 

public struct GraphDataWithID 
{ 
    public int IdHeader; 
    public string Type; 
} 
  • Also, wie Sie erreichen ich den Vergleich zwischen zwei auf dem Index basiert Listen?
+0

Sie können einfach eine 'for' -Schleife verwenden, wenn dies eine' Liste' oder ein Array ist. Oder Sie können 'Enumerable.Zip' verwenden – juharr

Antwort

2

Keine Notwendigkeit Linq zu verwenden:

var n = Graph._listData.Count; 
for (var i = 0; i < n; i++) 
    if (Graph._listData[i].Type != newData2[i].Type) { 
     var temp = Graph._listData[i]; 
     temp.Type = newData2[i].Type; 
     Graph._listData[i] = temp; 
    } 

I edited entsprechend zu dem, was juharr wies darauf hin: Wenn Sie eine Liste der unveränderlichen Strukturen haben, können Sie die Struktur-Elemente an Ort und Stelle nicht ändern können.

+0

Hey, wenn ich so versuche, bekomme ich den Fehler" Kann den Rückgabewert von 'List .this [int]' nicht ändern, weil es keine Variable "auf der Teil "Graph._listData [i] .Type = newData2 [i] .Type;" –

+1

@FabioSoares Das bedeutet, Sie haben eine Liste von Strukturen. Sie müssen also eine Kopie der Struktur abrufen, den Wert ändern und die aktualisierte Kopie wieder in die Sammlung einfügen. Allerdings, wenn Ihre Struktur es veränderlich ist, dann werden Sie viele andere Probleme haben. Grundsätzlich müssen Sie 'var temp = Graph._listData [i]; temp.Type = newData2 [i] .Typ; Graph._listData [i] = temp; 'damit es funktioniert. – juharr

+0

Nur um zu bemerken, dass, wenn statt '_listData' Array Array wäre, die' struct' Elemente an der richtigen Stelle wie in der ursprünglichen Antwort geändert werden könnten. –

2

Hinweis: Dies funktioniert nur für Referenztypen.

Eine Alternative eine for Schleife zu verwenden ist Zip

var zipped = Graph._listData.Zip(
    newData2, 
    (o,n) => new { Original = o, NewDate= n}) 
foreach(var pair in zipped) 
{ 
    pair.Original.Type = pair.NewData.Type; 
} 

Das Schöne an Zip ist, dass es mit der kürzeren der beiden Sammlungen zu stoppen, so dass, wenn newData2 Sie weniger Zeilen hat nicht haben Führen Sie spezielle Prüfungen durch, um sicherzustellen, dass der Index außerhalb des zulässigen Bereichs liegt.

jedoch für eine List von structs eine for Schleife wäre eine bessere Idee sein, da Sie eine temporäre Variable zu verwenden haben die Kopie der Struktur zu halten, aktualisieren, und weisen Sie in der List in die ursprüngliche Position zurück.

int end = Math.Min(Graph._listData.Count(), newData2.Count()) 
for(int i = 0; i < end; i++) 
{ 
    if(Graph._listData[i].Type != newData2[i].Type) 
    { 
     var temp = Graph._listData[i]; 
     temp.Type = newData2[i].Type; 
     Graph._listData[i] = temp; 
    } 
} 
+0

Wenn ich versuche, dies zu tun, erhalte ich den Fehler "Kann den Rückgabewert von 'List .this [int]' nicht ändern, da es keine Variable" im Teil "Graph._listData [i] .Type = newData2 [i] .Typ; " –

+0

@FabioSoares Ich habe die for-Schleife aktualisiert, um Strukturen zu handhaben. – juharr

+1

@FabioSoares Ich würde auch wärmstens empfehlen, 'FormA_DataType' in eine' Klasse' zu ​​ändern, wenn Sie das können, weil [muable Strukturen böse sind] (https://stackoverflow.com/questions/441309/why-are-mutable-structs-) böse) – juharr

1

Sie können den Listen wie folgt beitreten. Es verwendet die Überladung der Select-Methode, die einen Func mit einem Index verwendet.

var joined = from left in leftList.Select((s, i) => new { s, i }) 
      join right in rightList.Select((s, i) => new { s, i }) 
       on left.i equals right.i 
      select new { left.s.Time, left.s.Temp1, left.s.Temp2, right.s.Type }; 
+0

Haha, das ist eine nette Lösung, aber ein bisschen Overkill – Lovy

Verwandte Themen