Как проверить, что элемент не находится в элементе управления, используя foreach?
В настоящее время я пытаюсь использовать цикл foreach, чтобы проверить, нет ли элемента viewview в списке, и не будет ли писать его снова. Это мой код до сих пор.
private void button1_Click(object sender, EventArgs e)
{
TextReader reader = new StringReader(richTextBox1.Text);
string[] strItems = null;
foreach (ListViewItem item in listView1.Items)
{
strItems = reader.ReadLine().Split("-".ToCharArray());
item.Text = strItems[0].ToString();
item.SubItems.Add(strItems[1].ToString());
item.SubItems.Add(strItems[2].ToString());
item.SubItems.Add(strItems[3].ToString());
item.SubItems.Add(strItems[4].ToString());
listView1.Items.Add(item);
}
}
Вся помощь приветствуется!
4 ответа
Вы можете также прочитать все строки для начала, используя File.ReadAllLines
, Затем вы можете удалить дубликаты, используя LINQ .Distinct()
расширение:
private void button1_Click(object sender, EventArgs e)
{
string[] lines = File.ReadAllLines(richTextBox1.Text);
foreach (string line in lines.Distinct())
{
listView1.Items.Add(new ListViewItem(line.Split({'-'})));
}
}
Я также использовал ListViewItem
более удобный конструктор.
Я думаю, что ответ @ minitech пропустил одну часть: вы не просто хотите добавлять только новые отдельные записи, вы также хотите отфильтровать все новые записи, которые уже есть в списке.
private void button1_Click(object sender, EventArgs e)
{
string[] lines = richTextBox1.Lines;
// Not sure about the exact Items.Contains() and item.Text usage, but that's the idea
foreach (string line in lines.Distinct().Where(line =>
!listView1.Items.Contains(item => line == item.Text)))
{
string[] items = line.Split('-');
listView1.Items.Add(new ListViewItem(items));
}
}
Есть способы оптимизировать это, но выбор правильного будет зависеть от того, откуда в первую очередь поступают элементы списка (и сколько элементов в списке, т.е. сколько вам нужно оптимизировать это).
Ваш код только для проверки существующего ListViewItem? Если вы хотите, чтобы ваш код добавлял новый элемент в пустой ListView, то он потерпит неудачу, поскольку он не будет идти внутри цикла foreach, если у вас ничего нет в ListView.
Если можете попробовать следующее для проверки существующего ListViewItem
private void button1_Click(object sender, EventArgs e)
{
TextReader reader = new StringReader(richTextBox1.Text);
string[] strItems = null;
foreach (ListViewItem item in listView1.Items)
{
strItems = reader.ReadLine().Split("-".ToCharArray());
if (ListView1.FindItemWithText(strItems[0].ToString()) != null)
{
item.Text = strItems[0].ToString();
item.SubItems.Add(strItems[1].ToString());
item.SubItems.Add(strItems[2].ToString());
item.SubItems.Add(strItems[3].ToString());
item.SubItems.Add(strItems[4].ToString());
listView1.Items.Add(item);
}
}
}
Пожалуйста, обратитесь к URL ниже
Я не уверен, что понимаю ваш вопрос.
Если вы просматриваете все элементы, которые уже находятся в ListView для определенного соответствия, то почему бы просто не использовать "FindItemWithText()" или эквивалентный:
Если по запросу ничего не возвращается, элемент отсутствует в списке.
"Надеюсь, это поможет... хотя бы немного...