2017-01-23 9 views
1

まあ、私はC#を初めて使っていて、ここに問題があるようです。私はすでに問題を知っていますが、解決方法はわかりません。私は単に私のリストに追加したいオブジェクトを上書きしています。誰でも助けてくれますか?リストと "新しい"パラメータを扱うときの混乱

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)); 
       dataSet.Clear(); 
       Console.WriteLine(); 
      } 
     } 
    } 
} 
+2

あなたの問題は何ですか? – Quantic

+0

どのような値が上書きされ、何をしようとしているのかを詳しく教えてください。 – bc004346

+0

"myData"という名前のリストに2番目のデータセットを追加すると、既存のすべてのデータが上書きされるため、最新のものとx個のコピーのみがリストに追加されます – Michael

答えて

0

問題を正しく理解している場合は、データセットに文字列のリストを追加してください。その後、そのリストを消去します。それはあなたにリストへの参照を追加して、そのリストにあなたの呼び出しをクリアするように見えます。それがあなたの価値を失う理由です。そのリストのコピーを他のデータセットに追加する必要があります。あなたはMYDATA

に追加リストをクリアしません)、そのようdataSet.Clearを()

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(以下のコードを試してみて、それへの参照を追加するのではなく、リストのコピーを返します。

0

あなたが抱えている問題の1つは、List<T>というキーワードを付けて少し混乱させてしまった可能性があると思います。 A DataSetは独自のものであり、このコードを読みにくくします。まず、のはそれをクリーンアップしてみましょう:

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(); 
      } 
     } 
    } 
} 

あなたはあなたのデータソースの値を渡す必要がありますが、List<T>は参照型です。

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(); 
       } 
      } 
     } 
    } 

行われているすべてのDataSetList<string>を受け取るコンストラクタを持っていないので、それはまだ、動作しません。 myData.Add(new DataSet(theData))を実際のコンストラクタに変更する必要があります。興味深いことに、DataSetはここでやっていることにとって貧しい選択かもしれません。表示されていない複数のテーブルを使用している場合を除き、DataTableを1つだけ使用するほうがよいです。でも、そのすべてと

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(); 
       } 
      } 
     } 
    } 

あなたはDataTableStringBuilderクラスに見れば、あなたは自分自身に多くの問題を節約することでしょう。あなたがしようとしているよりも、このすべてを行うためのより良い方法があります。

+1

これをテストしましたか?DataSetにリストをパラメータとして受け取るコンストラクタがないようです。 – PaulF

+0

私は投稿後に奇妙なコンストラクタに気づいたので、私は戻ってそれを修正し、答えを補いました。 – CDove

+0

DataSetがあらかじめ定義されたクラスであることを知りませんでした。自分のDataSetクラスを作成して全く別のものを作成します。 – Michael

関連する問題