2012-05-14 4 views
1

Я написал следующее общее расширение LINQ для вычисления средневзвешенного значения в Visual Basic 2010:Generic LINQ расширение для вычисления средневзвешенного в Visual Basic 2010

<Extension()> 
Function WeightedAverage(Of T)(ByVal source As IEnumerable(Of T), 
       ByVal selectorValue As Func(Of T, Integer), 
       ByVal selectorWeight As Func(Of T, Integer)) As Double 
    Dim weightedValueSum As Double 
    Dim weightSum As Integer 

    weightedValueSum = (From element In source 
         Select (selectorValue(element) * selectorWeight(element))).Sum() 
    weightSum = (From element In source 
       Select selectorWeight(element)).Sum() 
    If weightSum <> 0 Then 
     Return weightedValueSum/weightSum 
    Else 
     Return 0 
    End If 
End Function 

Как я могу назвать эту функцию как Агрегатная функция другого LINQ запрос?

Я пробовал следующим образом:

Dim q1 = From jd In oContext.JobDatas 
     Where jd.Year = 2011 
     Select jd 
Dim q2 = Aggregate num In q1 Into WeightedAverage(num.AvSalary, num.NumPosHolder) 

Визуальный редактор Basic 2010 говорит мне, что второй запрос (q2) следующего кода не является действительным заявление. В запятой между первым вторым аргументом говорится: «)». Что не так?

+0

Я не очень хорошо знаком с заполнителем, но если не вызывается как метод расширения, WeightedAverage принимает три параметра, и вы просто пройти два параметры. Это не сработает. –

ответ

1

Есть ли какая-либо конкретная причина для использования функции агрегации? Если вы просто хотите, чтобы вычислить взвешенное среднее значение первого запроса, вы можете сделать это:

Dim q1 = From jd In oContext.JobDatas 
     Where jd.Year = 2011 
     Select jd 
Dim avg As Double = q1.WeighedAverage(Function(num) num.AvSalary, Function(num) num.NumPosHolder) 
+0

Большое спасибо. Нет особых причин использовать функцию «Агрегат». Ваше решение отлично работает для меня. –

+0

@PeterHorak: Отлично! Я вижу, что вы новичок в StackOverflow. Для каждого вопроса, для которого вы получите подходящий ответ, вы должны принять ответ, который вам больше всего помог, щелкнув галочку рядом с ответом. –

 Смежные вопросы

  • Нет связанных вопросов^_^