Как проверить, что элемент не находится в элементе управления, используя 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 ниже

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.listviewitemcollection.find(v=vs.85).aspx

Я не уверен, что понимаю ваш вопрос.

Если вы просматриваете все элементы, которые уже находятся в ListView для определенного соответствия, то почему бы просто не использовать "FindItemWithText()" или эквивалентный:

Если по запросу ничего не возвращается, элемент отсутствует в списке.

"Надеюсь, это поможет... хотя бы немного...

Другие вопросы по тегам