我正在寻找一个数据结构,它保留前n个元素,类似于这个问题,但增加了维护排序顺序的要求.显然我可以在最后排序,但可能有更有效的方法来实现它.只有插入,永远不会删除,然后通过末尾的前n个元素进行迭代.
这个问题与语言无关,但它将在C#中,因此使用本机.NET集合的答案更可取.
编辑:我应该澄清,排序顺序仅在前n个元素被迭代时才最重要.在插入过程中,只要保留前n个元素,排序顺序就无关紧要了.
这类似于如何在Visual Studio 2013中强制打开解决方案文件(SLN)?但不一样 我有一堆与Visual Studio版本选择器关联的.sln文件。但是,它们都包含# Visual Studio 2012但我希望它们在Visual Studio 2013中打开。我可以/upgrade按照此链接打开带有标志的解决方案文件。但是,它只是说
This project/solution does not require migration. It will open without modification.
Run Code Online (Sandbox Code Playgroud)
并且不会更改文件,因此它们仍在VS2012中打开。您可以在Visual Studio 2013中显式打开解决方案并另存为,但这是一个非常手动的过程,我有数百个解决方案。当然有比在文件中查找/替换更好的方法吗?
我最近写了一个简单的for循环,并得到了一些意想不到的行为:
for(double x = 0.0; x <= 1.0; x += 0.05)
{
Console.WriteLine(x.ToString());
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
Run Code Online (Sandbox Code Playgroud)
请注意,即使继续for循环的条件似乎包含它,也不会出现1.我意识到这是因为十进制数字作为二进制存储在内存中,即 1实际上不是1,而是实际上是1.0000000000000002(根据Visual Studio中的变量监视).所以我的问题是,避免这种意外行为的最佳方法是什么?一种方法是使用decimal类型而不是double,但大多数System.Math函数double仅在s上工作,并且两者之间的转换并不简单.
我在C#中使用.NET TabControl时出现了一个奇怪的问题(Visual Studio 2010).启动Windows窗体应用程序.添加选项卡控件和按钮.在两个标签页中添加两个不同的标签,以便区分它们.按钮的目的只是作为下一个按钮; 使用以下代码订阅其Click事件:
tabControl1.SelectTab(1);
Run Code Online (Sandbox Code Playgroud)
假设用户在第一个选项卡上输入了错误,所以当他们尝试转到第二个选项卡时我们要将它们发回去,所以使用以下代码订阅选项卡控件的SelectedIndexChanged事件:
if(tabControl1.SelectedIndex == 1)
{
tabControl1.SelectTab(0);
}
Run Code Online (Sandbox Code Playgroud)
现在运行程序并单击按钮.您会注意到,根据顶部突出显示的选项卡判断,第一个标签页是看起来被选中的标签页,正如您所期望的那样.但是,根据实际显示在选项卡控件主体中的选项卡页面判断,它仍然是显示的第二个选项卡页面!调用各种控件'Focus(),Update()和Refresh()函数似乎没有帮助.这里发生了什么?