问题似乎很简单,但我无法解决。我有一个来自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());
}
答案 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开始。