我有一个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);
}
此代码将所有数组列表项添加到列表视图中,而不进行检查!
答案 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.Clear
:https://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);
}