Я новичок в программировании, надеюсь, вы поможете мне написать лучший код.
Описание
Я хочу написать запрос, который печатает средние баллы калифорнийцев, которые активны и имеют букву 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);
@ValerijDobler Вы правы, так есть ли простой способ сделать это с помощью convert ? мое решение сложное.
Простой способ сделать что? Вопрос неясен - много текста, но нет конкретного вопроса, нет оригинального и ожидаемого. Метод Main содержит всего 3 простых запроса. Вы спрашиваете, как объединить несколько условий? Цепочки Where пунктов. Однако в вопросе, похоже, нужен только один Where. Нет попытки написать запрос, вычисляющий средние значения
Является ли запрос, как рассчитать агрегаты, такие как средние значения? Вам нужен GroupBy и одна из многих дополнительных функций, таких как Avg, Sum, Count и т. д. Все описанные вами условия могут быть объединены в один Where.
@PanagiotisKanavos Мне очень жаль. Я отредактировал вопрос, теперь он выглядит более понятным?
В коде нет попытки вычислить средние значения, поэтому неясно, в чем проблема. Проходя мимо
выводит средний балл студентов при следующих условиях: Средний балл студентов, которые живут в ЦА, и их деятельность соответствует действительности, а в их именах есть буквы 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 в середине, поэтому базе данных придется искать всю таблицу.
Мне не нужно. st.StudentActivity — логическое значение, поэтому st.StudentActvity == true эквивалентно просто st.StudentActvity
Что касается the condition of r/d name should be checked first., порядок не влияет на результат в пункте AND. Все утверждение верно только в том случае, если все утверждения верны. Порядок может повлиять на производительность оценки в памяти, но база данных не будет пытаться оценивать эти условия для каждой строки. Если возможно, он будет использовать индексы для быстрого поиска набора строк, соответствующих условию.
Спасибо. да, когда я пытался, я получил ошибку. это тоже была одна из моих проблем, я не знал, что нет необходимости писать значение активности.
C# — это не JavaScript, приятель. Ты должен конвертировать.