【问题标题】:match list view items against array list in c#将列表视图项与 C# 中的数组列表匹配
【发布时间】:2012-07-09 08:59:24
【问题描述】:

我有一个 ArrayList 包含一些 HashTables ,我有一个 ListView 包含一些项目。

我需要将数组列表与列表项匹配。

如果一个项目在列表视图中而不是在数组列表中,那么它应该从列表视图中删除。

如果不在列表视图或数组列表中,则将其添加到列表视图。

这是一些代码:

 ArrayList online_list = users;
 foreach (Hashtable i in online_list)
            {
                    ListViewItem item = new ListViewItem();
                    item.Text = (string)i["u_name"];
                    item.Name = (string)i["id"];
                    item.ImageIndex = 0;
                    lstvUsers.Items.Add(item);
            }

此代码将所有数组列表项添加到列表视图中,无需检查!

【问题讨论】:

  • 你还在使用 1.1 还是为什么要使用 ArrayLists 和 Hashtables?
  • iam on 3.5,我使用它们是因为我从 php webservice 接收数据,这些数据返回关联的数组和数组数组,所以如果你知道更好的解决方案指向我,我必须使用它们,但我仍然需要回答

标签: c# listview arraylist hashtable


【解决方案1】:

您可以先clearListView中的所有项目,然后在ArrayList中添加所有项目:

lstvUsers.Clear();
foreach (Hashtable i in online_list)
{
    ListViewItem item = new ListViewItem();
    item.Text = (string)i["u_name"];
    item.Name = (string)i["id"];
    item.ImageIndex = 0;
    lstvUsers.Items.Add(item);
}

您应该使用ListView.Clear 而不是ListView.Items.Clearhttps://stackoverflow.com/a/10170049/284240

编辑:由于您坚持只想从 ListView 中删除不在 ArrayList 中的项目,并添加不在 ListView 但在 ArrayList 中的项目。这种方法的效率要低得多,因为您需要将 ListView 中的每个项目与 ArrayList 中的每个项目进行比较(反之亦然),而不是什么都不做。

例如:

var addItems =  online_list
    .Cast<Hashtable>()
    .Where(ht => !lstvUsers.Items.ContainsKey((string)ht["id"]));
var removeItems = lstvUsers.Items
    .Cast<ListViewItem>()
    .Where(lvi => !online_list.Cast<Hashtable>().Any(ht => (string)ht["id"] ==lvi.Name));

foreach (var removeItem in removeItems)
{
    lstvUsers.Items.Remove(removeItem);
}
foreach (var addHashTable in addItems)
{
    ListViewItem item = new ListViewItem();
    item.Text = (string)addHashTable["u_name"];
    item.Name = (string)addHashTable["id"];
    lstvUsers.Items.Add(item);
}

【讨论】:

  • 我现在已经这样做了,但是由于我每 3 秒刷新一次内容,它会在@列表视图中闪烁,如果我这样做了,则会删除任何选择!
  • @SamyMassoud:你也可以在lstvUsers.Items.Clear();之前使用ListView.BeginUpdate,在循环之后使用ListView.EndUpdate。那会更快。
  • 您提到的所有内容都是非常有用的东西,它可以防止闪烁问题,但我真正需要的是(如果我的列表中有两个项目 Samy 和 Tim,当我有下一次更新时,我只有蒂姆所以我需要的只是从列表中删除萨米而不删除蒂姆)
  • @SamyMassoud:您知道您的方法比简单地清除列表并在 ArrayList 中添加项目效率低吗?您必须将 ListView 中的每个项目与 ArrayList(f.e. 1000 * 1000) 中的每个项目进行比较,而不是什么都不比较。
  • @SamyMassoud:编辑了我的答案以显示一种仅删除/添加必要项目的方法。但这确实效率低下。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2023-03-08
  • 2021-07-12
  • 2016-07-23
  • 2011-02-10
  • 2018-04-15
  • 2016-09-30
相关资源
最近更新 更多