【问题标题】:Filter string collection based on listview item基于listview项过滤字符串集合
【发布时间】:2011-12-05 15:01:01
【问题描述】:

已解决

奇怪的是,这里发生的事情似乎是 string[] 集合在没有元素时被迭代。因此,每个项目都将从用户列表中删除。添加了额外的检查以确保nicks.Count !=0,它添加并完美运行。当代码做你意想不到的事情时必须爱;)

---[初始问题]---

所以,我在这里有点困惑。

当我们连接到我们的服务器时,我们会得到一个字符串集合结果string[]。然后我们解析该字符串集合,并将名称添加到列表视图。但是,我们还需要解析列表视图,并删除任何未出现在字符串集合中的项目。

我似乎无法找到正确执行此操作的方法。我知道这很容易,但到目前为止我尝试过的任何事情都失败了,这完全不酷:(

将字符串集合过滤到列表视图而不添加重复项的代码:

foreach (var nick in nicks)
        {
            if (string.IsNullOrEmpty(nick)) continue;
            var lvi = new ListViewItem
                          {
                              Text = nick,
                              Group = nick.StartsWith("@") ? listViewEx1.Groups[0] : listViewEx1.Groups[1]
                          };
            if (listViewEx1.Items.Count != 0)
            {
                var foundItem = listViewEx1.FindItemWithText(nick, true, 0, false);
                if (foundItem != null) continue;
            }
            lvi.ImageIndex = 0;
            listViewEx1.Items.Add(lvi);
        }

那么,我如何反过来比较列表视图中的项目与字符串集合中的项目,并删除那些不存在的项目?

调试信息

Element in 'nicks':   Bot
Element in 'nicks':   Test
Element in 'nicks':   @Mike
Element in 'nicks':   @Jack
Element in 'nicks':   Joe
Element in 'nicks':   Nancy
Element in 'nicks':   Roger
Element in 'nicks':   
Does not contain:  @Mike
Does not contain:  @Jack
Does not contain:  Bot
Does not contain:  Joe
Does not contain:  Test
Does not contain:  Nancy
Does not contain:  Roger

奇怪的是,即使 nicks[] 集合包含项目,item.Text 包含昵称,.Contains() 调用却不匹配它。

【问题讨论】:

    标签: c# winforms string listview collections


    【解决方案1】:

    如果这些只是简单的字符串,那么这样的东西应该可以工作:

    List<ListViewItem> itemsToRemove = new List<ListViewItem>();
    foreach(ListViewItem item in listViewEx1.Items)
    {
       if(!nicks.Contains(item.Text))
          itemsToRemove.Add(item.Text);
    }
    
    foreach(ListViewItem item in itemsToRemove)
       listViewEx1.Items.Remove(item);
    

    单独的remove循环的原因是你不想在迭代期间修改Items集合,否则你会得到一个异常。

    【讨论】:

    • 看,我也是这么想的,我使用了一些不同的东西,但是,它删除了列表视图中的每个项目。似乎nicks.Contaions(item.Text) 不匹配。
    • 而令人困惑的部分是item.Text 仍然返回字符串集合中存在的相同元素,所以我不知道为什么Contain 不匹配。
    • @zackrspv 重新检查我的答案,我有一个错字,不确定这是否对你有影响。
    • 是的,它仍在删除每个元素。我在最初的问题中添加了调试信息,以便您可以看到 nicks[] 集合确实包含信息,并且 item.Text 结果返回相同的信息,但它与 .Contains() 检查不匹配。还有其他选择吗?
    • @zackrspv 你能提供你用来生成调试信息的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2010-11-20
    • 2019-04-22
    • 1970-01-01
    • 2015-03-06
    • 2019-08-16
    相关资源
    最近更新 更多