webmail123 Ответов: 2

Избежать дубликатов в ListView


У меня есть метод, работающий синхронно в фоновом режиме. Я получаю строку из этого метода каждый раз, когда он выполняется. Я добавляю эту строку в виде списка. В представлении списка я создал один столбец. Я добавляю элемент с помощью:

ListViewItem lvi = new ListViewItem();
lvi.text=epc; //epc is the string that I want ti insert in listview
listview1.Items.Insert(0,lvi);


Теперь я хочу избежать дубликатов, которые я могу получить в строке "epc". Поскольку listbox имеет свойство lisbox1.contains (), listview не работает по той же логике.

Что я уже пробовал:

if(!lisetView1.items.contains(lvi))
{
    ListViewItem lvi = new ListViewItem();
}


Эта логика не работает. Мне нужно решение, чтобы избежать вставки дубликатов в listview.

2 Ответов

Рейтинг:
15

phil.o

Проблема в том, что вы сравниваете ListViewItem объекты, которые, даже если они могут иметь один и тот же текст, являются различными объектами. Таким образом, ваше сравнение не достигает того, чего вы ожидаете.
Ты можешь попробовать

using System.Linq;

// ...

if (!listView1.Items.Any(i => i.Text == epc)) {
   listView1.Items.Add(new ListViewItem(epc));
}


Edit: решение без Linq
Без LINQ, необходимо обязательно прибегнуть к старому проверенному итерация по коллекции:
bool found = false;
foreach (ListViewItem item in listView1.Items) {
   if (item.Text == epc) {
      found = true;
      break;
   }
}
if (!found) {
   listView1.Items.Add(new ListViewItem(epc));
}


webmail123

Спасибо за ответ. Но я использую мобильную платформу Windows 6.0 SDK. Я не могу использовать System.Linq. Ни то, ни другое я не могу использовать .Любое свойство для класса listView.
Короче говоря, я не могу использовать listView1.Предметы.Любое имущество.

phil.o

Пожалуйста, смотрите мой обновленный ответ.

webmail123

Большое вам спасибо за ответ.

phil.o

Добро пожаловать.

Рейтинг:
10

kmoorevs

Вы можете просто использовать список (строки). список строк.Contains(epc) будет работать так, как вы ожидаете.


webmail123

Спасибо за ответ. Но я не совсем понял, о чем вы говорите. Можете ли вы предоставить пример кода, чтобы я получил четкое представление?

kmoorevs

//scope is same level as listView1
private List<string> strList = new List<string>();

Когда вы добавляете элемент в listView1, также добавьте его в strList, но только после того, как убедитесь, что он еще не существует в списке. (ранее вы были на правильном пути) вместо проверки значения в коллекции элементов listView проверьте общий список.
   if (! strList.Contains(epc))
      {
          listView1.Items.Add(new ListViewItem(epc));

           strList.Add(epc);
       }

Недостатком этого решения является то, что вы должны поддерживать список, что достаточно просто. Когда вы удаляете или даже редактируете элемент в listview, убедитесь, что вы также удаляете или редактируете из списка. Вот чтобы удалить выбранные элементы:
foreach (ListViewItem l in listView1.SelectedItems)
{
    strList.Remove(l.Text);
    l.Remove();
}

Еще один хак, который я использовал раньше, - это сохранение строки с разделителями. Это будет выглядеть примерно так:
private string delimitedString = "";

//when adding item(s) to listview
            if (!delimitedString.Contains("|" + epc + "|"))
            {
                listView1.Items.Add(new ListViewItem(epc));
                if (listView1.Items.Count == 1)
                {
                    delimitedString = "|";
                }
                delimitedString += epc  + "|";
            }
//when removing item(s) also remove from the delimited string like this:
            foreach (ListViewItem l in listView1.SelectedItems)
            {
                delimitedString = delimitedString.Replace("|" + l.Text + "|", "|");
                l.Remove();
            }

webmail123

Эй.. Большое спасибо. Таким образом, я фактически избежал цикла, который поможет мне увеличить производительность. Большое вам спасибо за Ваш вклад. :-)