Что самый короткий путь состоит в том, чтобы реализовать прокси или класс декоратора в c#?

Во-первых, необходимо определить, какие столбцы содержат какой префикс. Затем мы используем это для выполнения groupby.

grouper = [next(p for p in prefixes if p in c) for c in df.columns]
u = df.groupby(grouper, axis=1).sum()

   ab  wx
0   3   7
1   3   7
2   3   7
3   3   7

Почти там, сейчас,

u.sum().to_frame().T

   ab  wx
0  12  28

Другой вариант использует np.char.startswith и argmax для векторизации:

idx = np.char.startswith(
    df.columns.values[:, None].astype(str), prefixes).argmax(1)

(pd.Series(df.groupby(idx, axis=1).sum().sum().values, index=prefixes)
   .to_frame()
   .transpose())

   ab  wx
0  12  28
7
задан LDomagala 4 February 2009 в 16:06
поделиться

2 ответа

Для проксирования Вы могли изучить "RealProxy", если Вы хотите использовать стандартные типы, это - что-то вроде стычки для использования, хотя (и это требует, чтобы классы наследовались MarshalByRefObject).

public class TestProxy<T> : RealProxy where T : class
{
    public T Instance { get { return (T)GetTransparentProxy(); } }
    private readonly MarshalByRefObject refObject;
    private readonly string uri;

    public TestProxy() : base(typeof(T))
    {
        refObject = (MarshalByRefObject)Activator.CreateInstance(typeof(T));
        var objRef = RemotingServices.Marshal(refObject);
        uri = objRef.URI;
    }

    // You can find more info on what can be done in here off MSDN.
    public override IMessage Invoke(IMessage message)
    {
        Console.WriteLine("Invoke!");
        message.Properties["__Uri"] = uri;
        return ChannelServices.SyncDispatchMessage(message);
    }
}

Кроме того, Вы могли получить "DynamicProxy" из Замка.. Это работает немного лучше, по моему опыту..

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

Решение Marc будет иметь лучшую производительность.

4
ответ дан 7 December 2019 в 10:08
поделиться

К сожалению, в C# нет никакой поддержки смешивания. Таким образом, необходимо было бы реализовать все методы или использовать некоторый мощный reflection.emit, чтобы сделать это. Другая альтернатива (дополнительно) прокси / базовый класс декоратора...

abstract class FooBase : IFoo {
   protected FooBase(IFoo next) {this.next = next;}
   private readonly IFoo next;
   public virtual void Bar() { // one of the interface methods
       next.Bar();
   }
   public virtual int Blop() { // one of the interface methods
       return next.Blop();
   }
   // etc
}

затем

class SomeFoo : FooBase {
   public SomeFoo(IFoo next) : base(next) {}
   public override void Bar() {...}
}

Замечание того использования FooBase является строго дополнительным; любой IFoo позволяется.

2
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

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