#c# #linq
#c# #linq
Вопрос:
У меня есть следующий запрос:
var results = from theData in GeometricAverage
group theData by new { study = theData.study, groupNumber = theData.groupNumber, GeoAverage= theData.GeoAverage } into grp
select new
{
study = grp.Key.study,
groupNumber = grp.Key.groupNumber,
TGI = testFunction(grp.Key.GeoAverage, Also here I want to pass in the GeoAverage for only group 1 (but for each individual study))
};
Что я хочу сделать, так это то, что для каждого исследования существует несколько групп с показателем GeoAverage для каждой группы. TGI вычисляется путем передачи среднего значения для каждой группы и среднего значения для группы 1 (по каждому исследованию) в функцию testFunction. Я не могу понять, как передать значение только для группы 1.
Надеюсь, это имеет смысл.
РЕДАКТИРОВАТЬ: Образец данных:
Study Group GeoAverage
1 1 3
1 2 5
1 3 6
2 1 2
2 2 3
2 3 9
Итак, для приведенных выше данных я бы хотел, чтобы каждое среднее значение для каждой группы оценивалось по среднему значению для группы 1 в рамках того же исследования. Итак, если у меня есть, скажем, функция:
int foo(int a, int b)
{
return a * b;
}
Используя приведенные выше данные, я бы сначала оценил исследование 1, группа 1 сама по себе, поэтому дважды передайте GeoAverage 3 и верните 9. Для исследования 1, группы 2, введите GA группы 2 в 5, а для исследования group1 GA в 3, возвращая 15.
Комментарии:
1. Ваши данные неясны; по чему вы не группируете? Я вижу, что вы используете
Key
только в инструкции select.2. Образец данных и ожидаемые результаты также помогли бы…
3. Добавлена дополнительная информация. Спасибо.
Ответ №1:
Теперь мы с этим разобрались. Я перебираю коллекцию данных, для которых я хочу сохранить значение, и использую следующие два запроса LINQ:
foreach (var data in compoundData)
{
var controlValue = from d in GeometricAverage
where d.study == data.study
where d.groupNumber == "1"
select d.GeoAverage;
var treatmentValue = from l in GeometricAverage
where l.study == data.study
where l.groupNumber == data.groupNumber
select l.GeoAverage;
data.TGI = CalculateTGI(controlValue, treatmentValue);
}