Wie kann ich die Suche für eine bestimmte struct Wert? Vielleicht ein besserer Ansatz?
Ich versuche zu finden, eine Struktur, die ich zuvor erstellt haben, dass hat einen bestimmten Wert. Sobald ich es gefunden, den ich einstellen will-Variablen auf das struct. Ich weiß nicht, wie dies zu tun. Gibt es einen besseren Weg, dies zu tun? Vielleicht Klassen? Oder sollte structs arbeiten?
Zum Beispiel, mein struct:
public struct MyTest
{
public string device;
public string status;
public string revision;
public string number;
public string ledmo;
}
Mein Test-Code:
MyTest thisTest=new MyTest();
thisTest.device=blah;
thisTest.number=blah2;
MyTest thisTest2=new MyTest();
thisTest2.device=blah5;
thisTest2.number=blah6;
//Another Part in my code.
//Need to find the MyTest Structure that 'device' variable = the string 'blah'
var Foundit=MyTest.find(device==blah);
Foundit.revision=blah9999;
- Sie müssen speichern, um die Strukturen in eine Sammlung von einer Art, und dann schauen Sie auf jedes Element in der Auflistung zu suchen, den Eintrag, den Sie möchten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde eine Klasse verwenden, weil Mutable structs sind böse
Grunde, weil jeder
struct
kopiert wird, selbst wenn Sie finden die richtige Struktur, Sie werden immer nur ändern, eine Kopie. Sagen wirMyTest.find
findet thisTest2 was passiert ist dieseDazu mit einer Klasse, die Sie benötigen, um zu halten jeder Instanz der Klasse, die Sie erstellen in einer Liste oder eine andere Datenstruktur, so dass Sie wissen, Sie können es nachschlagen.
Wenn Sie dies tun, müssen Sie auch sagen, die Liste, wenn Sie fertig sind mit dem jeweiligen Objekt, andernfalls werden Sie hängen herum für immer und nie Müll gesammelt.
Bevor ich weiter gehen, sind Sie sicher, dass dies der beste Weg, um dieses problem zu lösen?
Sowieso, sagen Ihre Klasse
MyData
ist, kannst du eine statische Fabrik Methode genanntCreate
, die jedem neuen MyData-Objekt in eine Liste.Überall Sie verwenden eine MyData müssen Sie
Delete
es, wenn Sie fertig sind mit ihm.Ihr code wird
Ändern FoundIt jetzt auch Veränderungen
thisTest
P. S.: Es ist wichtig, dass nichts außerhalb
MyData
könnennew
eine Instanz vonMyData
. Wenn es könnte, dann gäbe es eine Instanz vonMyData
dass Sie nicht finden konnte, in AllInstances. Die Deklaration der Konstruktor private Mittel zu einem compiler-Fehler werden generiert, wenn code außerhalb MyData versucht, so etwas wievar someData = new MyData
Finden können Instanzen von einem Objekt zuvor erstellt haben, werden diese Instanzen müssen irgendwo gespeichert werden.
Eine Lösung wäre, Sie in eine Liste und später auch die Suche, die Liste:
Nun können Sie Ihre Suche mit LINQ:
Bitte beachten Sie:
Dies funktioniert nur, wenn Sie verwenden Sie Klassen anstelle von Strukturen, die als Binäre Worrier weist in seinem Kommentar.
thisTest
undthisTest2
. DaherfoundItem
ist ein kopieren vonthistest
(eigentlich ist es mindestens eine Kopie einer Kopie, wenn nicht eine Kopie einer Kopie einer Kopie), wenn Sie ändern die revision mitfoundItem.revision = "blah9999";
ändern Sie die Kopie,thisTest
bleibt unverändert.In diesem Fall eine Klasse besser funktionieren würde, weil der dynamischen Zeichenfolge, die Größe und die Tatsache, dass es so viele Saiten.
Mit dem test-code, sollten Sie die Speicherung einer
List<MyTest>
irgendwo in dieser Klasse und hinzufügen vonthisTest
undthisTest2
auf der Liste. Sie können später abgerufen werden bestimmte Werte (oder alle Werte eines bestimmtendevice
) mit der FindAll oder ähnliche Methoden.ValueType
wird eigentlich Engpass.myTest.Device = "Hello"; myTest2.Device = myTest.Device;
beidemyTest
undmyTest2
store eine referece auf die Zeichenfolge "Hallo", es ist nur ein string-Objekt hier. Ergo-der compiler kennt die Struktur, die Größe zur compile-Zeit.Können Sie Listen und Linq für.
SingleOrDefault
zurück kopieren der struct infoundIt
daherfoundIt.device = "123"
ändert die Kopie und das original bleibt unverändert.