Возникли проблемы с получением значений из группы - PullRequest
0 голосов
/ 04 октября 2019

Поэтому я пытаюсь получить два значения из 2 разных коллекций: пользовательскую коллекцию, в которой хранятся нужные мне имена, и коллекцию Post, в которой хранятся необходимые оценки. Я пытаюсь создать запрос LINQ, который захватывает все сообщения, опубликованные пользователем, сравнивая идентификаторы, а затем получая наименьшую оценку сообщений от этого пользователя. Вот что у меня есть:

Это выводит, какие 2 значения мне нужны, но не группирует их по минимальному значению.

 var lowestQuery =
                from user in Assignment1.userDict
                from post in Assignment1.allPosts
                where user.Value.ID == post.AuthorID
                orderby user.Value.Name ascending
                group post.Score by new { user.Value.Name, post.Score } into scores
                select new
                {
                    name = scores.Key,
                    lowestScore = scores.Min()
                };

В основном просто нужен самый низкий пост пользователей, но у меня возникают проблемы с группировкой двух значений. Когда я просто группирую по user.value.Name, я могу получить список имен правильно, но не Score, поскольку он не существует в счетах, которые я создал с помощью оператора groupby. Любая помощь будет оценена

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Так как вас интересует группировка только по имени пользователя, настройте вашу группу по условию так, чтобы группировать только по имени пользователя и возвращать записи записей (я переименовал в записи, так как вы получаете записи записей):

group post by user.Value.Name into posts

Затем вы можете использовать группу posts для выбора Min балла:

select new
{
     name = posts.Key,
     lowestScore = posts.Min(p => p.Score)
};

HTH

0 голосов
/ 04 октября 2019

Объединение пользователей и подобных сообщений будет иметь плохую производительность. Поскольку два предложения from создают вложенные циклы, временная сложность будет O(n^2). Лучше использовать групповое объединение

var lowestQuery = from user in Assignment1.userDict.Values
    join post in Assignment1.allPosts on user.ID equals post.AuthorID into posts
    select new {
        name = user.Name,
        lowestScore = posts.DefaultIfEmpty().Select(p => p?.Score).Min()
    };

Обратите внимание, что метод Min вызовет исключение, если коллекция пуста. DefaultIfEmpty создает null предмет. p?.Score возвращает обнуляемое значение. Будет null, если p равно нулю. См .: Нулевые условные операторы? и? []

...