Как выбрать общие элементы

#c# #linq #linq-to-objects

#c# #linq #linq-to-objects (привязка к объектам)

Вопрос:

Работайте над C # linq.У меня есть список для перечисления.Из этого списка я хочу получить общие элементы

 List<SQLFrameWorkTableEntity> oParent = new List<SQLFrameWorkTableEntity>();

            List<List<SQLFrameWorkTableEntity>> oChild = new List<List<SQLFrameWorkTableEntity>>();
            oListParentTable = oList.Where(p => p.Parent == true).ToList();
            foreach (SQLFrameWorkEntity item in oListParentTable)
            {           

                oChild.Add(GetTableSchemaList(item, oParent));
            }
  

введите описание изображения здесь
На картинке выше описано, как выглядит мое дочернее устройство.
Теперь этот дочерний элемент является списком list SQLFrameWorkTableEntity.Я хочу получить общие элементы из дочернего элемента.Как это получить?Если у вас есть какие-либо вопросы, пожалуйста, спросите.Заранее спасибо

После замены списка на список> я пишу приведенный ниже синтаксис linq

  var r=oChild.Select(p => p.Select(x => p.Any(y => y.ColumnName == x.ColumnName))).ToList();
  

Здесь, в r, я получаю, что все элементы списка верны, это означает, что я не могу сравнивать список со списком.Помогите мне исправить этот синтаксис.Спасибо

Комментарии:

1. Что вы подразумеваете под «общими элементами из oChild «? И почему oChild не является строго типизированным как List<Список<SQLFrameWorkTableEntity>>` или что-то подобное? Не совсем понятно, что вы имеете в виду.

2. спасибо, Джон Скит, я не знаю этот процесс List<Список<SQLFrameWorkTableEntity>>. Спасибо, я меняю свой синтаксис. Теперь, пожалуйста, скажите мне, как получить общие элементы из списка list.еще раз спасибо

Ответ №1:

Итак, вы хотите найти элементы, которые встречаются во всех списках, созданных GetTableSchemaList(item, oParent) ? Давайте предположим, что да.

Сначала добавьте Distinct() (если один список еще не выделен):

 oChild.Add(GetTableSchemaList(item, oParent).Distinct());
  

Затем после foreach выполнения:

 var count = oListParentTable.Count;
var r = oChild.SelectMany(i => i).GroupBy(i => i)
    .Where(g => g.Count() == count).SelectMany(i => i).Distinct();
  

Идея заключается в том, что «общие элементы» должны встречаться ровно, скажем, 4 раза в сжатом списке списков (SelectMany), когда количество отдельных списков в oChild равно 4.

Комментарии:

1. отличная работа, спасибо Гертарнольду. Хай! это меня смущает. Я пытаюсь понять, как это работает. Отлично . Еще раз спасибо. Пожалуйста, покажите мне какое-нибудь руководство для понимания такого рода сложных запросов.

2. Спасибо! Руководство: обучение! Что я сделал, когда был представлен LINQ, так это взял документацию по IEnmerable<T> и выполнил несколько упражнений с каждым методом расширения.

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

4. Вероятно, вам следует сделать что-то вроде GroupBy(i => i.ColumnName) . Таким образом, вы группируете по имени столбца, которое является свойством, идентифицирующим SQLFrameWorkTableEntity .

5. Гертарнольд спасибо за ответ.я уже пишу синтаксис как ocommon List = oChild. Выберите многие (i => i). GroupBy(i => i.ColumnName) . Где(g => g.Count() > 1).Выберите много (i => i). Distinct(). ToList();