我有以下代码
List<int> GetIndices<T>(List<T> list, ?????? condition
{
var result =
list
.Select((p, index) => index)
.Where(condition);
return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)
我想称之为 GetIndices(someList, (p, index) => (someList[index].Height < someList[index - 1].Height))
什么是正确的类型condition?
我正在寻找以下设置的最佳实践.
View是绑定到ViewModel的数据(通过WPF).ViewModel通过INotifyPropertyChanged更新视图.模型通过事件更新ViewModel.模型知道来自外部世界的东西,比如如何通过WebClient从互联网上获取东西,以及如何从数据库中检索数据.
获取和发送外部世界的东西应该异步完成,以便UI(以及扩展,用户)不会在外面世界等待.
最好的做法是什么?
1. ViewModel应负责异步调用模型方法.
这将具有能够写出类似的东西的优点
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
Url = result.Url;
}
Run Code Online (Sandbox Code Playgroud)
在ViewModel中,Url使用INotifyPropertyChanged更新View的ViewModel属性.甚至
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
_view.Url = result.Url;
}
Run Code Online (Sandbox Code Playgroud)
在哪里我们可以一起避免INotifyPropertyChanged.您更喜欢以下哪种方式?
但是,让Model本身进行异步工作可能更为明智.我们可能希望能够在没有View和ViewModel的情况下使用Model,同时仍然可以异步工作.另一个论点是,谁更清楚模型什么东西最好是异步处理.
2. Model自己处理所有异步内容.ViewModel代码变得更像
GetWebPage(string url) {
Model.GetWebPage(url);
}
Run Code Online (Sandbox Code Playgroud)
在模型中
GetWebPage(string url) {
var result = await Model.GetWebPageAsync(url);
if (UrlChanged != null);
UrlChanged(this, new UrlChangedEventArgs(url));
}
Run Code Online (Sandbox Code Playgroud)
ViewModel可以订阅,并相应地更新View.
您认为哪种方式是最佳做法?
Caliburn.Micro与Catel的 [ExposeAttribute]有类似的功能吗?
还有其他方法可以简化Caliburn.Micro中传递属性的工作吗?(即模型中的属性,但也在ViewModel中,以允许View访问属性.)
我有以下清单
a = [[a1, b1, c1, [d1, e1, f1],
[a2, b2, c2, [d2, e2, f2],
[a3, b3, c3, [d3, e3, f3]]
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它变成一个命名元组列表
a[0].val1
>>> a1
a[1].val2
>>> b2
a[0].box
>>> [d1, e1, f1]
Run Code Online (Sandbox Code Playgroud) 我对IO完成端口完成时实际发生的事情感到有些困惑.
我假设Win API允许访问IOCP队列,该队列能够以某种方式对具有特定句柄的回调引用进行排队(或堆栈)(比如说套接字).当Windows从NIC接收到中断时,它会在某个时刻到达NIC的IOCP队列并在其自己的(IOCP)线程池上执行回调.
我的问题是,来自线程池的线程是在接收到中断时产生的,还是在调用Win API时实际产生的,有效地使线程处于等待状态,直到它被IOCP唤醒队列?
编辑:
我发现了这个:http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-io-and-the-thread-pool.aspx其中是状态:"每当该操作完成时,它将在该I/O完成端口上对数据包进行排队.然后该端口将继续并使用其中一个线程池的线程来运行您指定的回调."
我有一个WriteableBitmap我使用不安全的方法来绘制像素.基本部分看起来像这样:
private unsafe void DrawBitmap(WriteableBitmap bitmap, byte[] pixels)
{
// Boilerplate omitted...
fixed (byte* pPixels = pixels)
{
for (int y = 0; y < height; y++)
{
var row = pPixels + (y * width);
for (int x = 0; x < width; x++)
{
*(row + x) = color[y + height * x];
}
}
}
bitmap.WritePixels(new Int32Rect(0, 0, width, height), pixels, width*pf.BitsPerPixel/8, 0);
}
Run Code Online (Sandbox Code Playgroud)
但是,不确定用户想要绘制的是什么类型byte,并且使这个方法通用(即DrawBitmap<T>)是有意义的但是如何使pPixels类型的指针T*?
是否有其他技巧可以使我的DrawBitmap …
我有一个笔记本,我打算用作其他笔记本的库.它有一些功能可以准备某些类型的文件等.
如何将笔记本包含在应该能够使用库笔记本中的功能的新笔记本中?
我有一个函数来计算序列的累积和.
let cumsum<'T> = Seq.scan (+) 0 >> Seq.skip 1 >> Seq.toArray
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很通用,但整数0使它成为非泛型的,因此我不能用浮点序列调用该函数.
是否有一个通用的零可以替代我的硬编码0,或者可能是一种使函数通用的不同方式.