我有一个C#中的整数列表.我希望删除重复项.在C++中,我将通过std :: sort和std :: unique算法运行它,以获得唯一列表的高效方法.
在C#中做同样事情的最佳方法是什么?换句话说,我正在寻找一种更优雅的方式来执行以下代码:
private static int[] unique(int[] ids)
{
IDictionary<int, object> d = new Dictionary<int, object>();
foreach(int i in ids)
d[i] = null;
int[] results = new int[d.Count];
int j = 0;
foreach(int id in d.Keys)
results[j++] = id;
return results;
}
Run Code Online (Sandbox Code Playgroud) 我有一个DateTime类,并希望按照某种格式显示它...在这种情况下,我特别希望将其格式化为YYYYMMDD格式.
这样做的最佳C#/ .NET API功能是什么?
继这个问题之后,我发现自己一遍又一遍地编写以下代码:
SqlCommand command = new SqlCommand();
// Code to initialize command with what we want to do
using (SqlConnection connection = openConnection())
{
command.Connection = connection;
using (SqlDataReader dataReader = thisCommand.ExecuteReader())
{
while (dataReader.Read())
{
// Do stuff with results
}
}
}
Run Code Online (Sandbox Code Playgroud)
必须嵌套两个using语句是相当繁琐的.有没有办法告诉 SqlDataReader它拥有该命令,并告诉命令它拥有该连接?
如果有办法做到这一点,那么我可以编写一个可以这样调用的辅助方法:
// buildAndExecuteCommand opens the connection, initializes the command
// with the connection and returns the SqlDataReader object. Dispose of the
// SqlDataReader to dispose of all resources that were acquired
using(SqlDataReader …Run Code Online (Sandbox Code Playgroud) 我试图了解如何实现类型推断.特别是,我不太清楚"统一"的繁重发挥在何处/为何发挥作用.
我将举一个"伪C#"的例子来帮助澄清:
天真的方式是这样的:
假设您将程序"解析"到表达式树中,以便可以使用以下命令执行:
interface IEnvironment
{
object lookup(string name);
}
interface IExpression
{
// Evaluate this program in this environment
object Evaluate(IEnvironment e);
}
Run Code Online (Sandbox Code Playgroud)
因此,"乘法"之类的东西可以用以下方式实现:
class Multiply : IExpression
{
IExpression lhs;
IExpression rhs;
// etc.
public object Evaluate(IEnvironment e)
{
// assume for the moment C# has polymorphic multiplication
return lhs.Evaluate(e) * rhs.Evaluate(e);
}
}
Run Code Online (Sandbox Code Playgroud)
然后要"实现"类型推断,你可以做类似的事情:
interface ITypeEnvironment
{
Type getType(string name);
}
interface IExpression
{
//as before
object Evaluate(IEnvironment e);
// infer type
Type inferType(ITypeEnvironment typeEnvironment);
} …Run Code Online (Sandbox Code Playgroud) 我继承了一些单元测试代码,它给了我一个弃用警告,因为它使用了"Assertion.AssertEquals":
警告CS0618:'NUnit.Framework.Assertion'已过时:'使用Assert类代替'
但是,我不能在Assert类中看到我应该使用的明显方法吗?
AssertEquals接收两个对象和一条消息,如果出现故障,可以使用该消息报告错误.例如
Assertion.AssertEquals(
"Enqueuing first item should set count to 1",
1, pq.Count);
Run Code Online (Sandbox Code Playgroud)
Assert类中的等价方法是什么?
我有一个越来越慢的 GUI 应用程序。我想开始为各种 GUI 任务引入计时——但是,我们的许多 GUI 操作会触发其他操作,然后“稍后调用”以触发其他操作。
最终,一切都安定下来,没有什么可做的了。此时,我想停止计时器并报告 GUI“动作”花费了多长时间。
我认为这样做的方法是实现一个名为invokeOnceIdle(Runnable task). 只有当 AWTEventQueue 为“空”时,该方法才会执行提供的任务。即提供的“任务”应该是队列中的最后一件事。
这样做的一种方法是,是否有一种方法可以指定“最低”优先级SwingUtilities.invokeLater- 但这是不可能的。
我接下来查看是否可以“invokeLater”一个 Runnable 来检查事件队列是否为“空”——但是没有公共方法可以查看事件队列是否真的为空。
做到这一点的最佳方法是什么?
请考虑以下代码:
class Program
{
static void Main(string[] args)
{
try
{
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("fo-FO");
var s = DateTime.MaxValue.ToString("yyyy-MM-ddTHH:mm:ssZ");
var d = DateTime.Parse(s, CultureInfo.InvariantCulture);
Console.WriteLine("Was able to parse with fo-FO");
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e);
}
try
{
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
var s = DateTime.MaxValue.ToString("yyyy-MM-ddTHH:mm:ssZ");
var d = DateTime.Parse(s, CultureInfo.InvariantCulture);
Console.WriteLine("Was able to parse with en-US");
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Exception: System.FormatException: String was not recognized as a …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个应用程序,它将自己注册为DDE服务器,以便它正确响应我们的自定义".qsx"文件类型,就像WinWord响应".docx"文件类型一样.
即
我们有第1部分完美无缺地工作.
但是,对于第2部分,Shell启动命令,但随后失败并显示"将命令发送到程序时出现问题".这对应于从"ShellExecute"Windows API函数返回的返回码"SE_ERR_DDEFAIL"(29).
实际上,我编写了一个名为"ShellExecute.exe"的自定义控制台应用程序,它可以完全独立于explorer.exe重现此问题.
如果我运行ShellExecute.exe并且我们的"DDE服务器"应用程序已启动,则它可以正常运行.如果我为".docx"文档运行ShellExecute.exe并且WinWord未运行,则WinWord正确启动并加载文档如果我为".qsx"文档运行ShellExecute.exe并且我们的应用程序未运行,ShellExecuteEx将启动该应用程序但在我们的服务器应用程序甚至有机会注册为DDE服务器之前,立即返回SE_ERR_DDEFAIL.
出于某种原因,似乎对于WinWord,ShellExecute等待它启动.
我已经尝试运行procmon.exe运行这两个案例,看看ShellExecute可能在注册表中寻找的区分我们的案例和WinWord.exe,但我找不到任何东西.
我真正需要的是ShellExecute算法的源代码,这样我就可以找出它为WinWord工作的原因,而不是我们的自定义扩展.
任何人都可以详细解释ShellExecute在启动应用程序时所做的工作,特别是它知道如何"等待"应用程序注册为DDE服务器?
我想提出一个"事件",它出现在.NET的系统事件查看器(eventvwr.exe)中.
不幸的是,谷歌只是给了我很多关于"事件"的东西,这些事件不是我想提出的事件.
什么是正确的API调用?
更新 感谢您的答案到目前为止.有趣的是,我发现即使我没有创建源,对"LogEvent"的调用也可以使用新的源代码.即
// The following works even though I haven't created "SomeNewSource"
EventLog.WriteEntry("SomeNewSource", message);
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?
我正在尝试编写一个Haskell追加函数......这就是我所拥有的:
myappend :: [a] -> [a] -> [a]
myappend [] x = x
myappend [x:xs] y = x : myappend xs y
Run Code Online (Sandbox Code Playgroud)
但是它给了我一个错误:发生检查:无法构造无限类型:a = [a]当推广`myappend'的类型时
所以,显然它有问题但是我看不到它...我的追加功能有什么问题?
.net ×6
c# ×6
datetime ×2
append ×1
assertions ×1
awt ×1
dde ×1
formatting ×1
haskell ×1
java ×1
nunit ×1
scheme ×1
sorting ×1
sql ×1
sql-server ×1
swing ×1
unification ×1
unique ×1
winapi ×1
windows ×1