小编Bja*_*ert的帖子

泛型类上的DebuggerDisplay

DebuggerDisplay在泛型类上应用该属性时遇到问题:

[DebuggerDisplay("--foo--")]
class Foo
{
}

[DebuggerDisplay("Bar: {t}")]
class Bar<T>
{
    public T t;
}
Run Code Online (Sandbox Code Playgroud)

当检查类型Bar<Foo>I 的对象时,它会显示为Bar: --foo--,但是我得到了Bar: {Foo}

我究竟做错了什么?

.net c# debugging visual-studio

13
推荐指数
2
解决办法
1284
查看次数

C#中泛型类的专业化模式?

在C#中,我有时希望能为泛型类的某些"实例化"创建特殊方法.

更新:下面的代码只是一个更抽象问题的一个愚蠢的例子 - 不要太关注时间序列,只是为某些T"添加额外的方法"的原则.

例:

class Timeseries<T> 
{ 
    ...
    TimeSeries<T> Slice(...) { ... }
}
Run Code Online (Sandbox Code Playgroud)

在T是double的情况下,我想要一些额外的方法,比如Integrate(),Interpolate()等等只有意义double,因为我需要对它们进行算术运算.

有几种方法可以做到这一点,但我找不到一个我满意的方法.

1.继承一个特殊的类

class TimeseriesDouble : Timeseries<double>
{ 
    double Interpolate(...) { ... }
    ...
}
Run Code Online (Sandbox Code Playgroud)

缺点: TimeseriesDouble.Slice()将返回一个新Timeseries<double>对象,现在缺少我的特殊方法.

2.外部方法

public static double Interpolate(Timeseries<double> ts, ...) { ... }
Run Code Online (Sandbox Code Playgroud)

缺点:打破OO原则.而且我不想放弃我的方法.此外,这些方法可能需要私有/受保护状态.

3.扩展方法

与2相同,只是使用更好的调用语法.

4.共同基类

class TimeSeries_base { ... }
class TimeSeries<T> : TimeSeries_base { .. typesafe versions of methods .. }
class TimeSeriesDouble : TimeSeries_base { .. …
Run Code Online (Sandbox Code Playgroud)

.net c# generics design-patterns

10
推荐指数
2
解决办法
8312
查看次数

链接两个函数() - >任务<A>和A->任务<B>

我不知道我是否以错误的方式思考TPL,但我很难理解如何获得以下内容:

我有两个功能

Task<A> getA() { ... }
Task<B> getB(A a) { ... }
Run Code Online (Sandbox Code Playgroud)

这似乎经常发生:我可以异步获得A.并且给定A,我可以异步获得B.

我无法弄清楚在TPL中将这些功能链接在一起的正确方法.

这是一次尝试:

Task<B> Combined()
{
    Task<A> ta = getA();
    Task<Task<B>> ttb = ta.ContinueWith(a => getB(a.Result));
    return ttb.ContinueWith(x => x.Result.Result);
}
Run Code Online (Sandbox Code Playgroud)

ContinueWith是我感到困惑的地方.返回的类型是"双任务",Task<Task<B>>.这对我来说似乎有些不对劲.

更新2011-09-30:

巧合的是,我找到了TaskExtensions.Unwrap对a Task<Task<T>>进行操作的扩展方法Task<T>.所以在我们得到C#5.0之前,我可以在这样的情况下执行ta.ContinueWith(a => ...).UnWrap(),其中continuation本身返回一个任务.

.net c# .net-4.0 task-parallel-library

10
推荐指数
2
解决办法
3454
查看次数

熊猫:跑NaN洞的长度

我有数百个时间序列对象,每个对象有100000个条目.缺少一定比例的数据条目(NaN).对我的应用来说,重要的是它们是单个,分散的NaN还是长序列的NaN.

因此,我想要一个函数来给我每个连续NaN序列的游程长度.我可以

myseries.isnull()
Run Code Online (Sandbox Code Playgroud)

得到一系列的布尔.我可以移动中位数或移动平均线来了解数据漏洞的大小.但是,如果有一种有效的方法来获得系列的长度列表,那将是很好的.

也就是说,拥有一个myfunc这样的东西会很好

a = pdSeries([1, 2, 3, np.nan, 4, np.nan, np.nan, np.nan, 5, np.nan, np.nan])
myfunc(a.isnull())
==> Series([1, 3, 2])
Run Code Online (Sandbox Code Playgroud)

(因为分别有1个,3个和2个NaN)

从这一点,我会打洞长度和的直方图andor的isnull的多个系列(即可能是海誓山盟的替代品),以及其他好东西.

我还想了解其他方法来量化数据漏洞的"结块".

python pandas

8
推荐指数
1
解决办法
1421
查看次数

重新实现另一个接口已经继承的接口

我看到这样的东西很多:

interface A { ... }
interface B : A { ... }
class C : B, A { ...}
Run Code Online (Sandbox Code Playgroud)

当B已经继承A时,为什么要指定C实现接口A?它是否会产生任何语义差异,还是只是风格问题?

(这样的例子很多被List<T>执行IList<T>ICollection<T>同时IList<T>也从派生ICollection<T>).


更新:感谢您确认我的猜测它没有任何语义差异.

我提出了一个相关的情况,它明确地命名一个已经在继承树中的接口,这确实有所不同:

如果B是一个类,C只会(重新)实现接口成员,A如果它A在' :' 后明确命名.

[编辑]我更改了问题的措辞,以避免与显式实现的接口成员混淆,后者将成员的使用限制为将对象强制转换为接口的情况.

.net c# language-design interface

6
推荐指数
1
解决办法
3024
查看次数

intellisense中的错误 - 如何向Microsoft报告?

我在Visual Studio intellisense的方法存根生成中发现了一个错误.

class A { }
class B : A
{
    A a;
    void f() { a.NewMethod(); }
}
Run Code Online (Sandbox Code Playgroud)

当我选择"Generate Method Stub"时a.NewMethod(),我应该得到一个公共方法.相反,intellisense会混淆自己并为我创建一个受保护的方法.

编译器能够正确抱怨调用生成的protected void NewMethod()A.

有没有办法向微软报告? 这篇文章说这是一个不可能通过的任务.

c# ide intellisense visual-studio-2008

2
推荐指数
1
解决办法
501
查看次数