假设我有一些类型的集合,例如
IEnumerable<double> values;
Run Code Online (Sandbox Code Playgroud)
现在我需要从该集合中提取k个最高值,对于某些参数k.这是一种非常简单的方法:
values.OrderByDescending(x => x).Take(k)
Run Code Online (Sandbox Code Playgroud)
但是,这(如果我理解正确的话)首先对整个列表进行排序,然后选择前k个元素.但是如果列表非常大,并且k相对较小(小于log n),则效率不高 - 列表以O(n*log n)排序,但我想从列表中选择k个最高值应该更像O(n*k).
那么,有没有人建议更好,更有效的方法来做到这一点?
我正在用C#编写一个需要跟踪当前活动登录用户的Windows服务.为此,我重写了OnSessionChange事件,以便记录用户何时登录,注销或锁定计算机.这通常在大多数情况下都有效,但有时服务会失去对活动用户的跟踪.在我的日志文件中,我可以看到问题是OnSessionChange方法.每次调用此函数时,我都会输出一些日志信息,显然,OnSessionChange会在某个时候调用错误的顺序.也就是说,如果用户锁定计算机然后再次快速登录,则有时会发生两个OnSessionChange调用,这导致以错误的顺序调用(例如,首先是解锁事件,然后是锁定事件).
有谁知道为什么会这样?这个问题是否有解决方法?
编辑:这是一些示例代码,以使其更清晰(希望):
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
try
{
var user = _getUserName(changeDescription.SessionId);
if (changeDescription.Reason == SessionChangeReason.SessionLock ||
changeDescription.Reason == SessionChangeReason.SessionLogoff ||
changeDescription.Reason == SessionChangeReason.ConsoleDisconnect)
LogText(String.Format("{0} locked at {1}\r\n", user, DateTime.Now));
else if (changeDescription.Reason == SessionChangeReason.SessionUnlock ||
changeDescription.Reason == SessionChangeReason.SessionLogon ||
changeDescription.Reason == SessionChangeReason.ConsoleConnect)
LogText(String.Format("{0} unlocked at {1}\r\n", user, DateTime.Now));
base.OnSessionChange(changeDescription);
}
catch (Exception e)
{
LogText("Exception: " + e);
}
}
Run Code Online (Sandbox Code Playgroud)
(函数_getUserName和LogText没有显示,但它们按照他们的名字建议.另外,我从来没有得到异常,所以try-catch-block只是为了验证我实际上没有得到任何.)
现在,有时,在我的日志中我得到这样的事情:
UserA unlocked at 18.01.2015 08:40:29 UserA unlocked at 18.01.2015 08:44:28 UserA locked at 18.01.2015 …
我正在开发一款 Android 游戏,现在我想与我的孩子们一起测试它(这是一款在线游戏,因此与我的家人一起玩它似乎是一个显而易见的选择)。所以我将其上传到 Google Play Console,并设置了内部测试。我的妻子能够使用我发送给她的链接安装它,但是当我的孩子(9 岁)尝试时,他们收到一条错误消息,指出该应用程序被家长控制阻止,因此无法下载。
我使用的唯一家长控制软件是 Google Family Link。我暂时尝试允许所有应用程序(无论年龄限制),但这不起作用。内部测试是否根本不适合儿童,或者是否有一些我忽略的设置?
我在Internet Explorer中遇到持久性cookie的问题,也就是说,我可以设置cookie,但不能使它们持久存在.我正在使用Internet Explorer 11,并尝试过"Internet选项" - >"高级" - >"重置",但它没有帮助.
我写了这个测试代码:
class Program {
public static void Main(string[] args) {
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://+:7777/");
listener.Start();
ThreadPool.QueueUserWorkItem((o) = > {
while (listener.IsListening) {
ThreadPool.QueueUserWorkItem((c) = > {
HandleRequest(c as HttpListenerContext);
}, listener.GetContext());
}
});
Console.Write("Press any key to quit . . . ");
Console.ReadKey(true);
listener.Stop();
listener.Close();
}
static void HandleRequest(HttpListenerContext ctx) {
var cookie = ctx.Request.Cookies["TestCookie"];
if (cookie == null) {
Console.WriteLine("Setting cookie...");
var expiryDate = DateTime.UtcNow.AddDays(360);
ctx.Response.Headers["Set-Cookie"] = "TestCookie=some_value; Path=/; …
Run Code Online (Sandbox Code Playgroud) 我在单独的程序集中有一个通用类:
class MyGenericClass<T> { }
Run Code Online (Sandbox Code Playgroud)
在另一个程序集中,我尝试这样做:
var assembly = System.Reflection.Assembly.LoadFrom(@"C:\path-to\MyClassLibrary.dll");
var t1 = assembly.GetType("MyClassLibrary.MyGenericClass`1");
var t2 = assembly.GetType("MyClassLibrary.MyGenericClass`1[System.String]");
Run Code Online (Sandbox Code Playgroud)
现在,第一次调用GetType
将返回泛型类型,但第二次调用将返回 null。
我测试了对以下类型执行相同的操作List<>
:
var assembly2 = System.Reflection.Assembly.LoadFrom(@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll");
var t3 = assembly2.GetType("System.Collections.Generic.List`1[System.String]");
Run Code Online (Sandbox Code Playgroud)
现在,这一次有效了。返回的类型List<String>
。这让我完全困惑。
为什么GetType()
在使用类型参数调用时无法获取我的类型,而在使用相同类型参数调用时[System.String]
能够获取类型?List
还有其他方法可以获取我的类型吗?我知道我可以解析类型名,提取部分MyClassLibrary.MyGenericClass'1
和[System.String]
,然后根据这些类型实例化通用类型,但我可能会在此过程中搞砸一些事情,所以我正在寻找一种更简单,可靠的内置方法来获取这个类型的对象。