匹配列表查看项目对c#中的数组列表

时间:2012-07-09 22:06:58

标签: c# listview arraylist hashtable

我有一个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 个答案:

答案 0 :(得分: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);
}