【问题标题】:How can i detect if List<string> was changed ? And what is the last item that was added?如何检测 List<string> 是否已更改?最后添加的项目是什么?
【发布时间】:2014-07-24 04:16:08
【问题描述】:

我有一个计时器滴答事件:

private void timer2_Tick(object sender, EventArgs e)
{
    combindedString = string.Join(Environment.NewLine, ListsExtractions.myList);
    richTextBox1.SelectAll();
    richTextBox1.SelectionAlignment = HorizontalAlignment.Right;
    richTextBox1.Text = combindedString;
}

计时器设置为 50000 并且时间一直在一遍又一遍地运行。 现在,当我运行我的程序时,List&lt;string&gt; myList 有例如 3 个项目:

Index 0: Hello world
Index 1: 24/7/2014 21:00
Index 2: http://test.com

50 秒后有两个选项:列表未更改或已更改/更长。 如果未更改,则不执行任何操作,但如果更改则获取最新添加的项目。例如,如果列表现在已更改为此...

Index 0: This is the latest item added in index 0
Index 1: 24/7/2014 22:00
Index 2: http://www.google.com
Index 3: ""
Index 4: Hello world
Index 5: 24/7/2014 21:00
Index 6: http://test.com

...那么我需要做另外两个动作:

  1. 第一次运行程序时,检查最近的项目(本例中为Index 0 的字符串)是否包含两个单词/字符串。如果是,则做某事,否则,什么也不做。
    但是,如果它确实包含单词/字符串并且我们执行“做某事”,则仅在 50 秒后执行一次;即使索引 0 中再次存在单词/字符串,也不要再这样做。

  2. 50 秒后,如果列表发生变化并且在 Index 0 中存在此单词/字符串,请在 50 秒后再次执行一次操作。如果列表没有改变,即使单词/字符串仍然存在于索引 0 中,也不要再做一次。

    if (rlines[0].Contains("צבע אדום") || rlines[0].Contains("אזעקה"))
    {
        timer3.Start();            
    }
    

仅当索引 0 中存在单词/字符串之一时,我才想启动 timer3

如果 50 秒后没有任何变化,请不要再次启动 timer3

只有在 50 秒或更晚之后列表发生更改并且其中一个单词/字符串再次存在于索引 0 中时,才再次启动计时器 3。

【问题讨论】:

  • 我建议使用 ObservableCollection 而不是 List

标签: c# .net


【解决方案1】:

Generic List&lt;T&gt; 类不支持列表更改通知。
你要找的是ObservableCollection&lt;T&gt;
它有一个CollectionChanged,在修改集合时触发。

您可以通过以下方式使用它:

using System.Collections.ObjectModel;

ObservableCollection<string> myList;

//The cnstructor 
public MyClassname()
{
  this.myList = new ObservableCollection<string>();
  this.myList.CollectionChanged += myList_CollectionChanged;
}

void myList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
        //list changed - an item was added.
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            //Do what ever you want to do when an item is added here...
            //the new items are available in e.NewItems
        }
}

【讨论】:

  • Avi 我正在尝试使用 ObservableCollection 但它永远不会进入事件。我做到了: myl = new ObservableCollection(); myl.CollectionChanged += myl_CollectionChanged;我在执行 myl.CollectionChanged += myl_CollectionChanged; 后使用了一个断点它继续 form1 构造函数它永远不会进入 void myl_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 为什么?
  • 列表被修改时会调用该事件。 myl.CollectionChanged += myl_CollectionChanged; 只是将myl_CollectionChanged 方法告诉myl.CollectionChanged 的事件。预计构造函数将继续而不是跳转到myl_CollectionChanged 方法。请尝试以下操作:在 myl_CollectionChanged 方法中放置一个断点,然后将一个项目添加到列表中。然后该方法将被触发。
【解决方案2】:

要检测您的 list 是否已更改,请使用以下命令检查您的列表项计数: 您必须拥有包含当前列表项计数的 temp 变量:

int temp = list.Count;// 获取 List 中包含的元素个数。

那么当你添加项目时:

list.add("string one");

然后使用 temp 变量来做这样的事情:

if(temp != list.Count){
Console.WriteLine("list was changed.");
}

当然,如果您的列表未排序: 你可以得到最后一个项目:

list[list.Count - 1]; //列表中最后添加的项目

【讨论】:

  • list[foo] = bar 不会更改计数,foo 也不必是要更改的最新索引。
  • 此方法不会检测到从集合中添加和删除相同数量的项目的情况,或者其成员内部发生变化的情况。
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多