将列表中的每个项目转换为wpf中的字符串

时间:2019-12-28 13:25:51

标签: c# wpf foreach listboxitem converters

问题似乎很简单,但我无法解决。我有一个来自WPF中ListBox的列表,并且我想读取此列表的每个项目并对其进行测试(如果此列表中已存在)。因此,我尝试在foreach构造中将ListItem转换为字符串。但是看来,lbi是空的,我也不知道为什么。这是我的代码:

foreach(object lbi in liste.Items)
{
     ListBoxItem something = (ListBoxItem)liste.ItemContainerGenerator.ContainerFromItem(lbi);
     if (something.Content.ToString() != "someotherString")
          liste.Items.Add(something.Content.ToString());
}

3 个答案:

答案 0 :(得分:0)

您可以简单地使用.Cast<string>()

var filtered = liste.Items.Cast<string>().Where(x=> x!= "someotherString");
liste.Items.Clear();
liste.Items.AddRange(filtered);

答案 1 :(得分:0)

要删除列表框中的重复项...

    private void OpCode()
    {
        var result = listBox1.Items.Cast<string>().GroupBy(test => test)
               .Select(grp => grp.First())
               .ToArray();
        listBox1.Items.Clear();
        listBox1.Items.AddRange(result);
    }

编辑

要检查添加的内容...

    private void AddItem_Click(object sender, RoutedEventArgs e)
    {
       AddToListBox(InputText.Text);
    }

    private void AddToListBox(string newItem)
    {
        if (Names.Items.Contains(newItem))
            MessageBox.Show("Sorry that item is already in the listbox.");
        else
            Names.Items.Add(newItem);
    }

答案 2 :(得分:0)

在添加新项目之前检查重复项的问题是扩展性不太好。一般而言,执行顺序为O(n ^ 2),对少量项目来说是合适的,但会呈指数增长。

一种更好的处理方法是维护一个单独的HashSet<string>,其中包含所有已经添加到列表中的字符串,然后在添加任何新字符串之前对其进行检查。哈希表查找在恒定时间内发生(出于所有意图和目的),因此将执行顺序减少为O(n)。

哈希表的插入也固定时间发生,因此它也可以用于快速测试已经存在的列表中的重复项,或确定集合S中的哪些元素已经存在于集合T中;您只需从为已有列表创建HashSet开始。