#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();