2017-01-23 2 views
1

Nun, ich bin neu in C# und es scheint, dass ich ein Problem direkt hier habe. Ich kenne das Problem bereits, aber ich weiß nicht, wie ich es lösen soll. Ich überschreibe einfach das Objekt, das ich meiner Liste hinzufügen möchte. Kann mir jemand helfen?Verwirrung bei der Arbeit mit Listen und dem "neuen" Parameter

+2

Was ist dein Problem? – Quantic

+0

Bitte erläutern Sie, welcher Wert überschrieben wird und was Sie versuchen zu tun. – bc004346

+0

Wenn ich ein zweites Dataset zu meiner Liste "myData" hinzufüge überschreibt es alle vorhandenen Daten, so dass nur die neuesten und x Kopien davon in meiner Liste sind – Michael

Antwort

0

Wenn ich Ihr Problem richtig verstehe, fügen Sie eine Liste von Zeichenfolgen zu einem Dataset hinzu. Sie löschen diese Liste dann. Es sieht für mich so aus, dass Sie einen Verweis auf eine Liste hinzufügen, dann wird Ihr Anruf auf dieser Liste gelöscht. Deshalb verlieren Sie Ihre Werte. Sie müssen dem anderen Dataset eine Kopie dieser Liste hinzufügen. Versuchen Sie den Code unten

List<string> dataSet = new List<string>(); 
string s; 
while ((s = sr.ReadLine()) != null) 
{ 
    if (!String.IsNullOrEmpty(s)) 
    { 
     if (s[0] == '$') 
     { 
      dataSet.Add(s); 
      if (s.Contains("GPGGA")) 
      { 
       myData.Add(new DataSet(dataSet.ToList())); 
       dataSet.Clear(); 
       Console.WriteLine(); 
      } 
     } 
    } 
} 

dataSet.ToList() wird eine Kopie der Liste zurückzukehren, anstatt einen Verweis darauf hinzuzufügen, dass die Art und Weise DataSet.Clear() wird die Liste nicht löschen Sie myData hinzugefügt

0

Ich denke, eines der Probleme, die Sie möglicherweise haben, ist, dass Sie sich ein wenig verwirrt haben, indem Sie Ihr List<T> ein Schlüsselwort benennen. A DataSet ist eine eigene Sache und macht diesen Code sehr schwer zu lesen. Lassen Sie uns zunächst, dass aufzuräumen:

List<string> theData = new List<string>(); 
string s; 
while ((s = sr.ReadLine()) != null) 
{ 
    if (!String.IsNullOrEmpty(s)) 
    { 
     if (s[0] == '$') 
     { 
      theData.Add(s); 
      if (s.Contains("GPGGA")) 
      { 
       myData.Add(new DataSet(theData)); //you're passing your source by reference. 
       theData.Clear(); 
       Console.WriteLine(); 
      } 
     } 
    } 
} 

Sie müssen den Wert Ihrer Datenquelle zu übergeben, aber ein List<T> ist ein Referenztyp.

List<string> theData = new List<string>(); 
    string s; 
    while ((s = sr.ReadLine()) != null) 
    { 
     if (!String.IsNullOrEmpty(s)) 
     { 
      if (s[0] == '$') 
      { 
       theData.Add(s); 
       if (s.Contains("GPGGA")) 
       { 
        List<string> bindingdata = theData.ToList(); 
        myData.Add(new DataSet(bindingData)); //you're passing 
        //your source by value, because it's using a new list. 
        theData.Clear(); //you can now safely do this. 
        Console.WriteLine(); 
       } 
      } 
     } 
    } 

Das alles getan, es immer noch nicht funktionieren, weil DataSet keinen Konstruktor hat, der ein List<string> akzeptiert. Sie müssen myData.Add(new DataSet(theData)) zum tatsächlichen Konstruktor ändern. Interessanterweise ist Ihre DataSet möglicherweise die schlechte Wahl für das, was Sie hier tun. Wenn Sie nicht mehrere Tabellen verwenden, die Sie nicht zu sein scheinen, verwenden Sie nur eine DataTable.

List<string> theData = new List<string>(); 
    string s; 
    while ((s = sr.ReadLine()) != null) 
    { 
     if (!String.IsNullOrEmpty(s)) 
     { 
      if (s[0] == '$') 
      { 
       theData.Add(s); 
       if (s.Contains("GPGGA")) 
       { //we don't need this now. 
        //List<string> bindingdata = theData.ToList(); 
//make myData a DataSet so you can use datatables 
// instead of attempting IEnumerable<DataSet> 

        DataTable foo = new DataTable("Foo");        
        foreach(string s in theData) 
        { 
         var y = foo.NewRow(); 
         y[0] = s; 
         foo.Rows.Add(y); 
        } 
        myData.Add(foo);         
        theData.Clear(); //you can now safely do this. 
        Console.WriteLine(); 
       } 
      } 
     } 
    } 

Selbst mit all das, würden Sie sich eine Menge Ärger Speichern, wenn Sie den Blick in DataTable und StringBuilder Klassen. Es gibt bessere Möglichkeiten, all das zu tun, als du versuchst.

+1

Haben Sie dies getestet - da DataSet anscheinend keinen Konstruktor hat, der eine Liste als Parameter akzeptiert. – PaulF

+0

Ich bemerkte den seltsamen Konstruktor, nachdem ich gepostet hatte, also ging ich zurück und korrigierte es und ergänzte die Antwort. – CDove

+0

Ich wusste nicht, dass DataSet eine vordefinierte Klasse ist, ich schreibe meine eigene DataSet-Klasse, die ganz andere Dinge tut – Michael

Verwandte Themen