小编Han*_*ant的帖子

C#迭代器设计的基本原理(与C++相比)

我发现了类似的主题:
C++(stl)与Java中的迭代器,是否存在概念上的差异?

这基本上处理Java迭代器(类似于C#)无法后退.

所以在这里我想关注限制 - 在C++迭代器中不知道它的限制,你自己将给定的迭代器与限制进行比较.在C#中,迭代器知道更多 - 如果迭代器有效,你可以在不与任何外部引用比较的情况下判断.

我更喜欢C++方式,因为一旦有了迭代器,你可以将任何迭代器设置为限制.换句话说,如果您只想获得少量元素而不是整个集合,则不必更改迭代器(在C++中).对我来说它更"纯粹"(清晰).

但是当然MS在设计C#时知道这个和C++.那么C#方式的优点是什么?哪种方法更强大(这导致基于迭代器的更优雅的功能).我错过了什么?

如果您对C#与C++迭代器设计的想法不同于它们的限制(边界),请同时回答.

注意 :(以防万一)请保持严格的技术讨论.没有C++/C#flamewar.

EDITS

正如Tzaman所说:"限制单独表达没有任何好处,因为除了一次走一个元素之外没有办法到达那里." 但是,构建一个一次执行几个步骤的C#迭代器并不困难,因此问题是 - 是否有一个显式限制迭代器的好处(如在C++中)?如果是 - 什么?

@乔恩,

Edit1:假设你有一个函数foo,它在迭代器上做了一些事情(这个例子很天真!)

void foo(iter_from,iter_end) // C++ style
void foo(iter) // C# style 
Run Code Online (Sandbox Code Playgroud)

现在你想在除了最后10个之外的所有元素上调用功能栏.

bar(iter_from,iter_end-10); // C++ style
Run Code Online (Sandbox Code Playgroud)

在C#中(如果我没有记错的话)你必须为这个迭代器提供额外的方法来改变它的限制,如下所示:

bar(iter.ChangeTheLimit(-10));
Run Code Online (Sandbox Code Playgroud)

编辑2:重读你的帖子后,我感觉到了至关重要的区别.在C++中,您处理集合的迭代器,在C#中您处理集合(迭代器在内部使用).如果是的话,我仍然对C#感到有点不舒服 - 你迭代了这个集合,当你找到有趣的元素时,你想要将所有元素从"here"传递到结尾.在C++中,它非常简单,没有开销.在C#中,您要么传递一个迭代器,要么传递一个集合(如果后者会有额外的计算).我等你的评论:-)

@Hans,

我不是在比较苹果和橘子.比较.理论在这里是共同点,所以你有排序算法,分区等.你有收集的概念(或序列,如乔恩喜欢).现在 - 问题是你如何设计对元素的访问,以便用C#或C++(或任何其他语言)编写优雅的算法.我想理解"我们这样做的原因,因为......".

我知道.NET迭代器和集合是单独的类.我知道访问元素和整个集合之间的区别.但是在C++中,处理集合的最常用方法是使用迭代器 - 这样您就可以使用列表和向量,尽管这些集合完全不同.另一方面,在C#中你更愿意写

sort(IEnumerable<T> coll) 
Run Code Online (Sandbox Code Playgroud)

功能而不是

sort(IEnumerator<T> iter)
Run Code Online (Sandbox Code Playgroud)

正确?所以在这个意义上我猜你不能把C#迭代器作为C++迭代器,因为C#不像C++那样表达相同的算法.或者正如Jon指出的那样 - 在C#中你更倾向于转换集合(Skip,Take)而不是改变迭代器.

c# iterator

7
推荐指数
3
解决办法
2408
查看次数

什么图像格式可以c#加载最快?

这可能看起来像一个奇怪的问题,我不知道图像的格式所以我会继续问...

我正在制作一个使用按钮网格的扫雷游戏(与不同的东西相关),然后我使用按钮向按钮添加精灵backgroundImage.如果网格是9x9,那很好.15x15它减慢速度和30x30你可以看到每个按钮被加载.

这引出了我的问题:哪种图像格式加载速度最快?显然,文件大小是加载速度的一部分,但是,我正在询问是否,例如,jpeg - 与gif相同的文件大小 - 将加载更快.或bmp,png等

我问这是为了看看我是否可以使用不同的格式更快地加载网格.

谢谢!

c# performance image winforms

7
推荐指数
1
解决办法
3899
查看次数

高DPI问题

我在高dpi设置下显示.NET Windows应用程序时遇到问题.

所有表单都设置为AutoScaleMode = DPI,但这并不能解决所有问题.

基本上标签最终扩大尺寸以应对更大的字体,但其他控件的位置不会改变,我们最终会用标签遮盖其他控件或彼此.

屏幕应该是这样的:http://www.manageinvest.com/good.jpg ..和高DPI它结束了看起来像这样:bad.jpg (这是我的第一篇文章,所以我只允许一个链接)

有什么建议?

提前致谢,

克里斯蒂安

.net dpi winapp

6
推荐指数
2
解决办法
7776
查看次数

如何缩放屏幕像素?

我写了一个2D跳转和运行引擎,产生320x224(320x240)的图像.为了保持旧学校"像素化" - 感觉它,我想根据用户的分辨率将得到的图像缩放2或3或4.

我不想缩放每一个精灵,而是生成的图像!

提前致谢 :)

xna 2d sprite

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

在运行时更改实现/类

我正在寻找在运行时更改对象(或变量)的具体类的(开源)程序(或算法)的真实世界示例.

Java中此类行为的示例可能类似于下面的代码片段.这里,LinkedList在频繁插入和/或移除的上下文中表现良好的a 被改变为a ArrayList,其在随机访问和迭代的上下文中表现良好.

List myList = new LinkedList(); 
/* Lots of inserts */
...
myList = new ArrayList( myList ); // 'change' into different class
/* Lots of iteration */
...
Run Code Online (Sandbox Code Playgroud)

上面的Java示例在性能之间LinkedList和之间ArrayList进行了更改.

但是,任何语言的示例,任何数据结构,使用任何技术*,以及出于任何原因都是受欢迎的.

*技术:简单简单,如上例所示,或者become:在SmallTalk中使用,或者__class__在Python中使用,或者......

java algorithm performance data-structures

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

从UWP中的CoreWindow对象获取HWND

这篇简短的MSDN文档称CoreWindow具有ICoreWindowInterop,它获取CoreWindow的句柄HWND.但我找不到如何获得它的参考(C#).请帮忙.

https://msdn.microsoft.com/en-us/library/dn302119(v=vs.85).aspx

c# hwnd uwp

6
推荐指数
2
解决办法
4272
查看次数

如何取消 HostingEnvironment.QueueBackgroundWorkItem

有没有办法取消后台任务 HostingEnvironment.QueueBackgroundWorkItem

CancellationToken哪个通知任务是否被取消,但我该怎么做?参考https://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx

成功取消涉及调用 CancellationTokenSource.Cancel 方法的请求代码

好的。我在哪里可以访问CancellationTokenSource

asp.net async-await cancellation-token

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

.net 默认事件处理程序

在我的产品中,我需要处理广泛的事件。为此,我使用了这样的代码:

public class Global
{
    public static event EventHandler<MyEventArgs> Message;
    public static void ShowMessage();
}
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个 WinForms 用户界面。在表单的代码中,我将订阅此事件并以某种默认方式处理它(例如,通过使用 System.Windows.Forms.MessageBox.Show() 方法)。现在的问题是如何允许用户创建派生表单并覆盖我的默认 Message 事件处理程序实现?

仅使用自定义实现第二次订阅事件并不能解决问题(将执行两个事件处理程序并可能显示两个消息框)。我看到的选项是:

//call OnSubscribeToMessageEvent() from either form's constructor or OnLoad event handler
protected virtual void OnSubscribeToMessageEvent()
{
    Global.Message += new EventHandler<MyEventArgs>(Global_Message);
}
private void Global_Message(object sender, MyEventArgs e)
{
    //my default implementation
}
Run Code Online (Sandbox Code Playgroud)

或者

//subscribe in either form's constructor or OnLoad event handler
protected virtual void Global_Message(object sender, MyEventArgs e)
{
    //my default implementation
}
Run Code Online (Sandbox Code Playgroud)

哪个版本更好,为什么?或者也许还有其他选择?

.net c# design-patterns

5
推荐指数
1
解决办法
6441
查看次数

在给定支持字段的情况下获取C#auto属性的PropertyInfo

我正在实现一个自定义IFormatter,将对象序列化为我们的遗留系统所需的自定义格式.

如果我声明一个C#auto属性:

[StringLength(15)]
public MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后在我的自定义序列化方法中,我通过以下方式获取序列化字段:

MemberInfo[] members = 
    FormatterServices.GetSerializableMembers(graph.GetType(), Context);
Run Code Online (Sandbox Code Playgroud)

如何访问装饰auto属性的StringLength属性?

我目前正在利用<PropertyName>k_backingfield命名约定获取属性信息.我宁愿不依赖它,因为它似乎是C#编译器实现的具体细节.有没有更好的办法?

c# c#-3.0

5
推荐指数
1
解决办法
846
查看次数

如何在WPF中制作页面翻转效果?

我发现的有关页面翻转的所有信息只是源代码,我无法实现我的代码. 本教程

有点解释了页面翻转背后的逻辑,但代码是针对Windows窗体而不是WPF.我不知道如何处理它因为我理解位图在WPF中没有使用相同的.

任何人都有一个很好的教程或者可以给我一些指示?我想要做的是我有一个图像填满整个屏幕,我想将其翻转到下一个图像(像一本书),也将占据整个屏幕.(屏幕上没有2个图像)

救命?

对于任何建议使用C++或DirectX的人,我对学习这些技能并不感兴趣.只有C#代码请.

c# wpf animation image page-flipping

5
推荐指数
1
解决办法
6525
查看次数