-1
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
        {
            BackgroundWorker worker = sender as BackgroundWorker; 
            while (true)
            {
                List<string> tempNamesAndTexts = new List<string>();
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {



                    string content = downloadContent();
                    GetProfileNames(content);
                    GetTextFromProfile(content);
                    for (int i = 0; i < names.Count; i++)
                    {
                        tempNamesAndTexts.Add(names[i] + " " + texts[i]);
                         namesAndTexts.Add(names[i] + " " + texts[i]);
                    }
                    if (InvokeRequired)
                    {
                        bool result = tempNamesAndTexts.SequenceEqual(namesAndTexts);
                        if (result == true)
                        {
                        }
                        else
                        {
                            foreach (string com in tempNamesAndTexts)
                            {
                                if (!namesAndTexts.Contains(com))
                                {
                                    MessageBox.Show(com);
                                }
                            }


                            //BeginInvoke(new Action(() => namesAndTexts.ForEach(Item => textBox1.AppendText(Item + Environment.NewLine))));
                        }

                        
                    }
                    reader.Close();
                    response.Close();
                    Thread.Sleep(1000);
                }
            }
        }

私はList<string> namesAndTextsForm1 レベルにあります。そして別の一時ローカルList<string> tempNamesAndTexts

私がする必要があるのは、DoWork で、DoWork の 2 つの関数を使用して、Web サイトから n 秒ごとに namesAndTexts を更新していることです。

最後に、たとえばnamesAndTextsリストがあります:

[0] ダニエル こんにちは
[1] モーセ こんにちは

このnamesAndTextsをtempNamesAndTexts Listと比較する必要があり、リストを更新するたびにそれらが同じ場合は何もしません。

しかし、それらが同じでない場合は、2 つのリストの違いを見つけ、この異なる部分だけを textBox に追加します。

問題は、namesAndTextsが常に成長し、18、36、72のインデックスが成長し、同じ文字列を何度も追加し続けることです。


私がする必要があるのは:

  1. n 秒ごとに Web サイトからコンテンツをダウンロードする (downloadContent();)

  2. GetProfileNames 関数で名前のリストを作成します。

  3. テキスト GetTextFromProfile 関数のリストを作成します。

  4. 2. と 3. の 2 つのリストのリストを、名前とテキストを一緒に作成します。

  5. 最後の更新を記憶するために、古いリストを 4. に保存します。

  6. 前回の更新と新しい更新を比較します。5. のリストと 4. のリストを比較してください。

  7. 比較結果が true 同一の場合は何もしません。

  8. 比較が同一でない場合は、両方のリストのどのインデックスが同じでないかを見つけて、他のリストと同じでないリストの文字列を textBox に追加します。

したがって、textBox は次のように表示されます。たとえば、まず List を textBox に追加します。

ダニエルはここにいます
モードはそこにいます
ダニエラは出かけています

2 回目の比較で同一でない場合は、同一でないインデックスを見つけ、このインデックスの文字列のみを textBox に追加します。

したがって、textBox は次のようになります。

Daniela is here
Modes there
Daniela is out
Yaron こんにちは

したがって、唯一の変更点は、Yaron 地獄が textBox に追加されたことです。

しかし、私はそれを行う方法を理解できません。どのインデックスが同じではないかを比較して、それらを取り出してテキストボックスに追加することはできませんリストの1つが成長し続ける理由を理解できないため、次の反復では2つのリストは同一ではなく、新しいインデックスもありませんテキストボックスに追加する名前とテキスト。

4

1 に答える 1

0

追加または削除されたアイテムを見つけることができますExept

        var list1 = new List<string> {"a", "b"};
        var list2 = new List<string> {"a", "c"};

        List<string> addedItems = list2.Except(list1).ToList();
        addedItems.ForEach(x => Console.WriteLine("Added items: {0}", x));

        List<string> removedItems = list1.Except(list2).ToList();
        removedItems.ForEach(x => Console.WriteLine("Removed items: {0}", x));

コンソール出力:

Added items: c
Removed items: b
于 2012-08-12T01:14:47.540 に答える