Arhn - архитектура программирования

Найти уникальное значение в группе групп

У меня две группы

using System.Collections.Generic;

namespace ConsoleApplication
{
    internal class Student
    {
        public string Name;
        public string Surname;
        public int Mark;
    }

    internal class Program
    {
        private static void Main()
        {
            var twoGroups = new List<List<Student>>
            {
                new List<Student>
                {
                    new Student { Name = "Anna",  Surname = "Mors",  Mark = 4 }, 
                    new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 }
                },
                new List<Student>
                {
                    new Student { Name = "Anna",  Surname = "Mors",   Mark = 4 }, 
                    new Student { Name = "Tommy", Surname = "Wojski", Mark = 4 },
                    new Student { Name = "Jimmy", Surname = "Lemon",  Mark = 4 }
                }
            };
        }
    }
}

Как я могу получить уникальных людей из обеих групп (по имени или любому другому свойству) с помощью linq?

Очевидно, что Томми есть, но я не знаю, как я могу выбрать его с помощью linq (или выбрать список уникальных лиц.

UPD

Кроме того, могу ли я выбрать группу, содержащую только уникального ученика.

using System.Collections.Generic;

namespace ConsoleApplication
{
    internal class GroupOfStudents
    {
        public string Code;
        public List<Student> Students;
    }

    internal class Student
    {
        public string Name;
        public string Surname;
        public int Mark;
    }

    internal class Program
    {
        private static void Main()
        {
            var twoGroups = new List<GroupOfStudents>
            {
                new GroupOfStudents
                {
                    Code = "A1",
                    Students = new List<Student>
                    {
                        new Student { Name = "Anna",  Surname = "Mors",  Mark = 4 }, 
                        new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 }
                    }
                },
                new GroupOfStudents()
                {
                    Code = "B2",
                    Students = new List<Student>
                    {
                        new Student { Name = "Anna",  Surname = "Mors",   Mark = 4 }, 
                        new Student { Name = "Tommy", Surname = "Wojski", Mark = 4 },
                        new Student { Name = "Jimmy", Surname = "Lemon",  Mark = 4 }
                    }
                }
            };
        }
    }
}

Я думаю, мне нужно выбрать ученика и подтолкнуть его в новую группу с таким же именем, верно?

06.06.2017

Ответы:


1

Вы можете использовать SelectMany, GroupBy и Count

IEnumerable<Student> uniqueStudents = twoGroups 
    .SelectMany(list => list)
    .GroupBy(student => student.Name)
    .Where(g => g.Count() == 1)
    .Select(g => g.First());

Это выбирает только студентов, которые не содержатся несколько раз в одном из обоих (или обоих) списков.

Если вы хотите сгруппировать по нескольким свойствам, используйте анонимный тип

    .GroupBy(student => new { student.Name, student.Surname })

Если вы хотите разрешить дубликаты в одном списке, но не в нескольких списках:

IEnumerable<Student> uniqueStudents = twoGroups 
    .SelectMany((list, index) => list.Select(student => new { student, index }))
    .GroupBy(x => x.student.Name)
    .Where(g =>
    {
        int index = g.First().index;
        return g.Skip(1).All(x => x.index == index);
    })
    .Select(g => g.First().student);

Акк. ваше редактирование

Если вы хотите удалить всех студентов из списков, которые отображаются также в других группах:

var studentNameLookup = twoGroups.SelectMany(g => g.Students).ToLookup(s => s.Name);
twoGroups.ForEach(g => g.Students.RemoveAll(s => studentNameLookup[s.Name].Count() > 1));
06.06.2017
  • О, я обновил свой вопрос, поэтому, если возможно, ответьте на него, пожалуйста, я отмечу ваш ответ как ответ. 06.06.2017
  • О, я имел в виду, что в первой группе есть ученик с тем же именем, что и во второй группе. Итак, мы выбираем этого студента из обеих групп. Третий студент тоже входит во вторую группу (по имени), поэтому мы вытаскиваем его тоже из всех групп. Вот так, я даже не уверен, что мы могли бы сделать это с linq. 06.06.2017
  • Только в 2 или n группах, а не в каждой группе. 06.06.2017
  • Давайте продолжим обсуждение в чате. 06.06.2017

  • 2
    1. свести вложенные списки в один SelectMany()
    2. группировать по уникальным критериям GroupBy() (я выбираю все свойства)
    3. выбрать уникальные записи Where()

    код:

    List<Student> result = twoGroups.SelectMany(x => x)
                           .GroupBy(x => new { x.Name, x.Surname, x.Mark })
                           .Where(x => x.Count() == 1)
                           .Select(x => x.First())
                           .ToList();
    
    06.06.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..