Listview, отображающий избыточные данные

У меня есть следующий код, в котором я добавляю данные в представление списка, но в итоге у меня появляются лишние элементы. Пожалуйста, дайте мне знать, где я иду не так

    private void button2_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();
        StreamReader sr = new StreamReader("C:\\sample.txt");
        string s;
        s = sr.ReadLine();

        while (s != null)
        {
            s = sr.ReadLine();
            var m = Regex.Match(s, @"^([a-zA-Z._]+)@([\d]+)");

            if(m.Success)
            {
                allcont ac = new allcont();
                ac.name = m.Groups[1].Value;
                ac.number = m.Groups[2].Value;
                con.Add(ac);
                foreach (allcont aa in con)
                {
                    ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
                    i.Tag = aa;
                    listView1.Items.Add(i);
                }
                s = sr.ReadLine();
            }
        }
        sr.Close();
    }
    contacts con = new contacts();
    public class contacts:List<allcont>
    { 

    }
    public class allcont
    {
        public string name;
        public string number;
    }
}

Мой sample.txt имеет это:

wer@123

erty@098

sdf@645

ytu@432

Обновление: это данные, которые показывает мой список:

name number    
wer  123
wer  123
erty 098
wer  123
erty 098
sdf  645
wer  123
erty 098
sdf  645
wer  123
erty 098
sdf  645
ytu  432

2 ответа

Решение

Я думаю, вы получите что-то вроде

wer@123

wer@123
erty@098

wer@123
erty@098
sdf@645

wer@123
erty@098
sdf@645
ytu@432

Причина: у вас есть проблема здесь

allcont ac = new allcont();
ac.name = m.Groups[1].Value;
ac.number = m.Groups[2].Value;
con.Add(ac);
foreach (allcont aa in con)
{
     ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
     i.Tag = aa;
     listView1.Items.Add(i);
 }

потому что вы делаете это в цикле while. (вы добавляете вещи в список con в каждом цикле, а затем зациклите этот "увеличенный список" внутри цикла while).

Таким образом, вы должны переместить "внутренний цикл"

foreach (allcont aa in con)
    {
         ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
         i.Tag = aa;
         listView1.Items.Add(i);
     }

вне цикла while (после sr.Close)

con.Add(ac);
                foreach (allcont aa in con)
                {
                    ListViewItem i = new ListViewItem(new string[] { aa.name, aa.number });
                    i.Tag = aa;
                    listView1.Items.Add(i);
                }

вы повторяете полную коллекцию кон
избавиться от внутренней петли

allcont ac = new allcont();
ac.name = m.Groups[1].Value;
ac.number = m.Groups[2].Value;
con.Add(ac);

ListViewItem i = new ListViewItem(new string[] { ac.name, ac.number });
i.Tag = aa;
listView1.Items.Add(i);
Другие вопросы по тегам