小编Hen*_*erg的帖子

提取列表的k个最大元素

假设我有一些类型的集合,例如

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# linq lambda

20
推荐指数
1
解决办法
2021
查看次数

Windows .NET服务 - OnSessionChange事件似乎非常不可靠

我正在用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 …

c# windows service login

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

与我的孩子进行内部测试 - Google Family Link 是否被阻止?

我正在开发一款 Android 游戏,现在我想与我的孩子们一起测试它(这是一款在线游戏,因此与我的家人一起玩它似乎是一个显而易见的选择)。所以我将其上传到 Google Play Console,并设置了内部测试。我的妻子能够使用我发送给她的链接安装它,但是当我的孩子(9 岁)尝试时,他们收到一条错误消息,指出该应用程序被家长控制阻止,因此无法下载。

我使用的唯一家长控制软件是 Google Family Link。我暂时尝试允许所有应用程序(无论年龄限制),但这不起作用。内部测试是否根本不适合儿童,或者是否有一些我忽略的设置?

android google-play-console google-play-internal-testing

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

持久性cookie无法在Internet Explorer中运行

我在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)

c# cookies internet-explorer

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

为什么 Assembly.GetType() 不适用于泛型类型实例?

我在单独的程序集中有一个通用类:

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],然后根据这些类型实例化通用类型,但我可能会在此过程中搞砸一些事情,所以我正在寻找一种更简单,可靠的内置方法来获取这个类型的对象。

c# generics reflection

2
推荐指数
1
解决办法
984
查看次数