Как пересечь два выбора с типом int и string в синтаксисе метода LINQ?

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

Описание

Я хочу написать запрос, который печатает средние баллы калифорнийцев, которые активны и имеют букву R или D в своем имени.

Пример ввода

StudentName = {"Ben Wild", Score = 65, StudentCity = "CA", StudentActvity= true}

StudentName = {"Sara Ride", Score = 81, StudentCity = "CA", StudentActvity = true}

Моя проблема

Я пробовал так много способов, что я упомяну свои решения ниже:

Код программы.cs

using System;
using System.Collections.Generic;
using System.Linq;

namespace _64_LINQ_Practice
{
    class Program
    {
        static void Main(string[] args)
        {
            //Access to the class method
            var studentList = StudentDatabase.GetStudentsFromDb();
            var studentsName6 = studentList.Where(x => (x.StudentActvity == true) && (x.StudentCity == "CA")).Select(x => x.StudentName);
            List<string> xstudent = new List<string>(studentList.Select(x => x.StudentName));
            IEnumerable<string> final = xstudent.Where(
                                x => x.Contains("R") || x.Contains("r") || x.Contains("d") || x.Contains("D"));

            foreach (string studentFinal in final)
            {
                Console.WriteLine("The students that are active, live in CA and names with r/R or D/d letter :" + studentFinal);
            }
        }
    }
}

И второй способ:

        var studentsName6 = studentList.Where(x => (x.StudentActvity == true) && (x.StudentCity == "CA")).Average(x => x.Score);
        List<string> xstudent = new List<string>(studentList.Select(x => x.StudentName));
        List<int> intstudent = new List<int>(studentList.Select(x => x.Score));
        IEnumerable<string> final = xstudent.Where(
                            x => x.Contains("R") || x.Contains("r") || x.Contains("d") || x.Contains("D"));
        IEnumerable<int> final2 = intstudent;
        var convFinal = final.AsQueryable();
        var convFinal2 = final2.AsQueryable();
        var final3 = studentsName6.AsQueryable().Concat(convFinal.AsQueryable()).Concat(convFinal2);
        var final4 = final3.average(x => x.Score);
        Console.WriteLine(final4);

C# — это не JavaScript, приятель. Ты должен конвертировать.

Valerij Dobler 16.02.2023 10:32

@ValerijDobler Вы правы, так есть ли простой способ сделать это с помощью convert ? мое решение сложное.

yas 16.02.2023 10:38

Простой способ сделать что? Вопрос неясен - много текста, но нет конкретного вопроса, нет оригинального и ожидаемого. Метод Main содержит всего 3 простых запроса. Вы спрашиваете, как объединить несколько условий? Цепочки Where пунктов. Однако в вопросе, похоже, нужен только один Where. Нет попытки написать запрос, вычисляющий средние значения

Panagiotis Kanavos 16.02.2023 10:42

Является ли запрос, как рассчитать агрегаты, такие как средние значения? Вам нужен GroupBy и одна из многих дополнительных функций, таких как Avg, Sum, Count и т. д. Все описанные вами условия могут быть объединены в один Where.

Panagiotis Kanavos 16.02.2023 10:44

@PanagiotisKanavos Мне очень жаль. Я отредактировал вопрос, теперь он выглядит более понятным?

yas 16.02.2023 11:03
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
1
5
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В коде нет попытки вычислить средние значения, поэтому неясно, в чем проблема. Проходя мимо

выводит средний балл студентов при следующих условиях: Средний балл студентов, которые живут в ЦА, и их деятельность соответствует действительности, а в их именах есть буквы R/r или D/d.

Кажется, что один Where нужен для фильтрации студентов, а затем Avg для расчета среднего. Поскольку нет необходимости вычислять средние значения для нескольких групп, GroupBy не нужен.

var letters=new[]{"r","d"};
var average=studentList.Where(st=>
        st.StudentActvity 
        && st.StudentCity == "CA"
        && letters.Any(l=>st.StudentName.Contains(l,StringComparison.OrdinalIgnoreCase))
     )
    .Average(st=>st.Score);

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

Letters.Any(l=>st.StudentName.Contains(l...)) проверяет, содержится ли внутри какая-либо буква StudentName

Этот запрос будет работать с базой данных в памяти и, возможно, с реальной базой данных. Хотя это будет очень медленно. name.Contains("r") переводится в условие SQL name LIKE '%r%'. Невозможно использовать индекс, чтобы быстро найти, какие имена имеют r в середине, поэтому базе данных придется искать всю таблицу.

yas 16.02.2023 11:42

Мне не нужно. st.StudentActivity — логическое значение, поэтому st.StudentActvity == true эквивалентно просто st.StudentActvity

Panagiotis Kanavos 16.02.2023 12:05

Что касается the condition of r/d name should be checked first., порядок не влияет на результат в пункте AND. Все утверждение верно только в том случае, если все утверждения верны. Порядок может повлиять на производительность оценки в памяти, но база данных не будет пытаться оценивать эти условия для каждой строки. Если возможно, он будет использовать индексы для быстрого поиска набора строк, соответствующих условию.

Panagiotis Kanavos 16.02.2023 12:07

Спасибо. да, когда я пытался, я получил ошибку. это тоже была одна из моих проблем, я не знал, что нет необходимости писать значение активности.

yas 16.02.2023 12:15

Другие вопросы по теме