Вызывать события C # извне класса-владельца?

Для гуглеров, которые приходят на этот старый вопрос:

Относительно комментария @ kekert к ответу @ Гаррета, чтобы использовать новый

df.groupby('id')['x'].rolling(2).mean()

, а не устаревший

df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)

Любопытно, что новый подход .rolling (). mean () возвращает многоиндексный ряд, сначала индексированный столбцом group_by, а затем индекс. В то время как старый подход просто возвращал серию, индексированную исключительно исходным индексом df, что, возможно, имеет меньшее значение, но очень удобно для добавления этой серии в новый столбец в исходный фрейм.

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

df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)

, который должен дать вам серию

0    0.0
1    0.5
2    1.5
3    3.0
4    3.5
5    4.5

, которая вы можете добавить в качестве столбца:

df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)
13
задан Matthew Scharley 20 September 2008 в 11:49
поделиться

3 ответа

Просто необходимо добавить открытый метод для вызова события. Microsoft уже делает это для некоторых событий такой как PerformClick для средств управления, которые представляют событие Click .

public class CustomGUIElement    
{
    public void PerformClick()
    {
        OnClick(EventArgs.Empty);
    }

    protected virtual void OnClick(EventArgs e)
    {
        if (Click != null)
            Click(this, e);
    }
}

Вы тогда сделали бы следующую внутреннюю часть Ваш обработчик событий в качестве примера...

public void CustomForm_Click(object sender, MouseEventArgs e)        
{
    _elements[0].PerformClick();
}
25
ответ дан Phil Wright 20 September 2008 в 11:49
поделиться

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

1
ответ дан Per Hornshøj-Schierbeck 20 September 2008 в 11:49
поделиться

Ключевое слово события в c# изменяет объявление делегата. Это предотвращает прямое присвоение на делегата (можно только использовать + = и - = на событии), и это предотвращает вызов делегата снаружи класса.

, Таким образом, Вы могли изменить свой код для сходства с этим:

public class CustomGUIElement
{
...
    public MouseEventHandler Click;
    // etc, and so forth.
...
}

Тогда можно вызвать событие снаружи класса как это.

myCustomGUIElement.Click(sender,args);

недостаток состоит в том, что код с помощью класса может перезаписать любые зарегистрированные обработчики очень легко с кодом как это:

myCustomGUIElement.Click = null;

, который не позволяется, если делегат Щелчка объявляется как событие.

8
ответ дан Lee 20 September 2008 в 11:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: