0

我有一个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);
            }

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

4

1 回答 1

0

您可以首先clear将 的所有项目ListView,然后将所有项目添加到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);
}
于 2012-07-09T22:16:46.593 回答