Перечислите все дубликаты в объекте List, включая количество - PullRequest
0 голосов
/ 24 сентября 2010

У меня есть объект List, заполненный экземплярами пользовательской структуры.

        list.Add(new Mail("mail1", "test11", "path11"));
        list.Add(new Mail("mail2", "test12", "path12"));
        list.Add(new Mail("mail1", "test13", "path13"));
        list.Add(new Mail("mail1", "test14", "path14"));
        list.Add(new Mail("mail2", "test15", "path15"));

        var q = from x in list
                group x by x.Sender into g
                let count = g.Count()
                where count > 2
                orderby count descending
                select new { Sender = g.Key};

        foreach (var x in q)
        {
            Console.WriteLine(x.Sender);
        }

Вывод этого кода будет следующим:

mail1

Но так как мне нужночтобы работать с каждым элементом Почты, который доступен более двух раз (или, может быть, n раз) в зависимости от значения определенного свойства (например, Отправитель), мне нужен запрос, чтобы показать ВСЕ элементы, которые встречаются чаще, чем n (включаяссылка на соответствующий почтовый элемент.

После заполнения запроса я бы хотел сделать что-то вроде этого:

    foreach (var x in q)
    {
        Console.WriteLine(x.Sender + " - " + x.Path + " - " + x.Count);
    }

Я новичок в LINQ, но уверен, что это как-то возможно.

Спасибо за вашу помощь

С уважением, Кевин

1 Ответ

1 голос
/ 24 сентября 2010

Включите свойства, которые будут добавлены к вашему анонимному типу.

var q = from x in list
        group x by x.Sender into g
        let count = g.Count()
        where count > 2
        orderby count descending
        select new
        {   // add your fields here
            Sender = g.Key,
            Path = ...,      // not sure what you wanted here
            Count = count,
            Mails = g,       // include the mails in the group
        };

Тогда вы можете делать с ним то, что хотите.

foreach (var x in q)
{
    // each x is a type with the fields
    //     Sender
    //     Path
    //     Count
    //     Mails
    Console.WriteLine(x.Sender + " - " + x.Path + " - " + x.Count);
    foreach (var mail in x.Mails)
    {
        // do something with each individual mail
    }
}
...