我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}
我究竟做错了什么?
在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) 我不知道我是否以错误的方式思考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本身返回一个任务.
我有数百个时间序列对象,每个对象有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)
从这一点,我会打洞长度和的直方图and或or的isnull的多个系列(即可能是海誓山盟的替代品),以及其他好东西.
我还想了解其他方法来量化数据漏洞的"结块".
我看到这样的东西很多:
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在' :' 后明确命名.
[编辑]我更改了问题的措辞,以避免与显式实现的接口成员混淆,后者将成员的使用限制为将对象强制转换为接口的情况.
我在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.
有没有办法向微软报告? 这篇文章说这是一个不可能通过的任务.