我发现了类似的主题:
C++(stl)与Java中的迭代器,是否存在概念上的差异?
这基本上处理Java迭代器(类似于C#)无法后退.
所以在这里我想关注限制 - 在C++迭代器中不知道它的限制,你自己将给定的迭代器与限制进行比较.在C#中,迭代器知道更多 - 如果迭代器有效,你可以在不与任何外部引用比较的情况下判断.
我更喜欢C++方式,因为一旦有了迭代器,你可以将任何迭代器设置为限制.换句话说,如果您只想获得少量元素而不是整个集合,则不必更改迭代器(在C++中).对我来说它更"纯粹"(清晰).
但是当然MS在设计C#时知道这个和C++.那么C#方式的优点是什么?哪种方法更强大(这导致基于迭代器的更优雅的功能).我错过了什么?
如果您对C#与C++迭代器设计的想法不同于它们的限制(边界),请同时回答.
注意 :(以防万一)请保持严格的技术讨论.没有C++/C#flamewar.
正如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#中,您要么传递一个迭代器,要么传递一个集合(如果后者会有额外的计算).我等你的评论:-)
我不是在比较苹果和橘子.比较.理论在这里是共同点,所以你有排序算法,分区等.你有收集的概念(或序列,如乔恩喜欢).现在 - 问题是你如何设计对元素的访问,以便用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)而不是改变迭代器.
这可能看起来像一个奇怪的问题,我不知道图像的格式所以我会继续问...
我正在制作一个使用按钮网格的扫雷游戏(与不同的东西相关),然后我使用按钮向按钮添加精灵backgroundImage.如果网格是9x9,那很好.15x15它减慢速度和30x30你可以看到每个按钮被加载.
这引出了我的问题:哪种图像格式加载速度最快?显然,文件大小是加载速度的一部分,但是,我正在询问是否,例如,jpeg - 与gif相同的文件大小 - 将加载更快.或bmp,png等
我问这是为了看看我是否可以使用不同的格式更快地加载网格.
谢谢!
我在高dpi设置下显示.NET Windows应用程序时遇到问题.
所有表单都设置为AutoScaleMode = DPI,但这并不能解决所有问题.
基本上标签最终扩大尺寸以应对更大的字体,但其他控件的位置不会改变,我们最终会用标签遮盖其他控件或彼此.
屏幕应该是这样的:http://www.manageinvest.com/good.jpg ..和高DPI它结束了看起来像这样:bad.jpg (这是我的第一篇文章,所以我只允许一个链接)
有什么建议?
提前致谢,
克里斯蒂安
我写了一个2D跳转和运行引擎,产生320x224(320x240)的图像.为了保持旧学校"像素化" - 感觉它,我想根据用户的分辨率将得到的图像缩放2或3或4.
我不想缩放每一个精灵,而是生成的图像!
提前致谢 :)
我正在寻找在运行时更改对象(或变量)的具体类的(开源)程序(或算法)的真实世界示例.
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中使用,或者......
这篇简短的MSDN文档称CoreWindow具有ICoreWindowInterop,它获取CoreWindow的句柄HWND.但我找不到如何获得它的参考(C#).请帮忙.
https://msdn.microsoft.com/en-us/library/dn302119(v=vs.85).aspx
有没有办法取消后台任务 HostingEnvironment.QueueBackgroundWorkItem?
有CancellationToken哪个通知任务是否被取消,但我该怎么做?参考https://msdn.microsoft.com/en-us/library/dd997396(v=vs.110).aspx
成功取消涉及调用 CancellationTokenSource.Cancel 方法的请求代码
好的。我在哪里可以访问CancellationTokenSource?
在我的产品中,我需要处理广泛的事件。为此,我使用了这样的代码:
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)
哪个版本更好,为什么?或者也许还有其他选择?
我正在实现一个自定义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#编译器实现的具体细节.有没有更好的办法?
我发现的有关页面翻转的所有信息只是源代码,我无法实现我的代码. 本教程
有点解释了页面翻转背后的逻辑,但代码是针对Windows窗体而不是WPF.我不知道如何处理它因为我理解位图在WPF中没有使用相同的.
任何人都有一个很好的教程或者可以给我一些指示?我想要做的是我有一个图像填满整个屏幕,我想将其翻转到下一个图像(像一本书),也将占据整个屏幕.(屏幕上没有2个图像)
救命?
对于任何建议使用C++或DirectX的人,我对学习这些技能并不感兴趣.只有C#代码请.