我经常需要处理一个项目队列,其中没有一个用户应该能够阻塞队列,并且队列中的项目应该按某种顺序处理.我经常写一个类来做这个,但我认为应该有一些通用版本,但我找不到一个.
所以我正在寻找一个队列类,我可以在其中指定一个类型,一个分区选择器和一个选择器,以便我可以将对象添加到队列中,然后当我将对象退出时,我从第一个对象中获取我的订单说明符排序的下一个分区.
例如,我会像这样调用如何分区以及如何对队列进行排序:
var queue = new RoundRobinQueue<Message>(
_ => _.UserID,
_ => _.SendDate
);
Run Code Online (Sandbox Code Playgroud)
后,我已经添加了很多信息的,我可以Parallel.ForEach在我的队列中的项目,并处理它们在最早的顺序SendDate下一个User.这样,如果一个用户很慢,他的项目将不会阻塞队列,因为他只获得一个线程,但如果只有一个用户,他是唯一的分区,所以他获得所有线程.
我看了一遍,但在C#中找不到一个很好的通用实现.有任何想法吗?
我对SQL非常强大,但我想不出这个"外观相似"数据分析问题的好方法:
给定一个带有一组整数的表,我需要将每个整数与最相似的第二个表中的整数相匹配(最小绝对差).通常我会根据数字的差异进行笛卡尔连接和排序,但是我只需要为每个表中的每一行进行一次配对,因此两个表中的值都不能使用两次.
知道怎么做到这一点?
编辑:示例:
TABLE_A
34
57
108
219
380
5000
Run Code Online (Sandbox Code Playgroud)
表-B
4000
200
400
99
40
33
34
4600
Run Code Online (Sandbox Code Playgroud)
配对将是table_a中的一行和table_b中最接近的行:
结果
34,34
57,40
108,99
219,200
380,400
5000,4600
Run Code Online (Sandbox Code Playgroud)
因此,两个表中的行都不会出现两次.
编辑:更多澄清:我试图解决这个问题,从table_a给出1行,我们找到table_b中最接近的1行.这成为一对,并被删除.然后从table_a取下一行并重复.所以我们试图找到每一行的最佳匹配并优化配对,而不是尝试优化总差异.
当我监听某个元素上的鼠标悬停时,我会触发一个事件,其中包含 screenX、clientX、pageX 以及许多其他关于鼠标相对于屏幕的位置以及相对于触发事件的元素的详细信息。
如果我只调用 element.mouseover(),我的处理程序会运行,但鼠标位置和其他属性都为空。我查看了 initMouseEvent,但它要求您指定我不知道的 screenX。
我的问题是,如何在鼠标不悬停在元素上甚至不在窗口中的情况下获取这些值?
我经常以下列形式运行查询:
select * from SomeTable where id=12345
Run Code Online (Sandbox Code Playgroud)
页面后一页可能正在运行相同的查询,因为用户需要该行的值.通常我会获取一次并缓存它,但用户可以随时更改行,而其他用户也同时在SomeTable中进行更改,因此我无法对整个表进行缓存.我还有一个问题,即我们有一个用于Web服务器的集群,因此当缓存失效时,我无法在Web服务器上进行内部跟踪.
有没有办法检测到这一行发生了变化?SqlDependecyCache类可以在这里帮助单个行到多个Web服务器吗?是否有一些可以通知我的Web应用程序的触发器或其他范例?
我想要两全其美 - 网络服务器上的实时缓存更新,但我不想运行任何查询以查看该行是否已更改,因为我可以轻松地再次获取该行.
我一直在测试WebForms中的异步,一次,我的问题不是关于如何做某事,而是关于已经有效的东西,是否有效.这是我的测试代码:
protected override void OnPreRender(EventArgs e)
{
Response.Write("OnPreRender<Br>");
}
protected override void OnPreRenderComplete(EventArgs e)
{
Response.Write("OnPreRenderComplete<Br>");
}
protected async override void OnLoadComplete(EventArgs e)
{
Response.Write("OnLoadComplete<br>");
var t1 = Task.Factory.StartNew(() => {
System.Threading.Thread.Sleep(2000);
return 1;
});
//This actually does run:
Response.Write((await t1).ToString());
}
Run Code Online (Sandbox Code Playgroud)
所以我的任务暂停一点,然后写出结果.我的问题是 - 我不希望这个工作,因为控制已经从OnLoadComplete方法产生 - 我希望页面实际完成渲染并在我的任务返回之前返回到客户端.
实际输出是:
OnLoadComplete
OnPreRender
1OnPreRenderComplete
Run Code Online (Sandbox Code Playgroud)
因此很明显,OnLoadComplete方法产生了控制权,以便OnPreRender可以运行,然后控制返回到OnLoadComplete.我的预期结果是"1"永远不会打印,因为随后的事件会触发,页面的线程将被杀死,或者在发送响应后发生任务后写入.我想,鉴于上述情况,即使我延迟10秒,结果也完全相同也就不足为奇了.
我假设WebForm引擎中有一些连接,确保在页面生命周期的下一阶段进行之前完成任何等待.有谁知道这是怎么发生的?我害怕在需要在其他事件之前完成的方法中使用async/await,因为担心延迟会太晚,但如果它在内部处理,那么我不会担心.
我有一个很大的对象列表,我有时需要迭代整个列表,有时我只想查看.Property ="somevalue"的对象.
目前我查看我的集合.Where(_ => _.Property="value_i_need"),如果我加载了100k对象并且只有少数人在我的目标组中,那么这个集合很昂贵.
所以我想要做的是将列表分段保存为Dictionary<string, List<T>>可以快速引用我想要的对象集,但是如果我这样做,如何使用Linq枚举所有字典中的所有对象使用更多内存来维护常规列表?
我在自定义类中有一组数据点.我还有许多不同的条件需要在我的应用程序中以不同的组合进行测试,我想将这些条件定义为表达式.假设我的收藏品有产品.
而不是写作
Products.Where(p => p.IsOnSale && p.Color == Color.Blue && p.Quality > 0);
Run Code Online (Sandbox Code Playgroud)
我希望能够做到的是,为了清楚起见,在一个地方定义谓词:
Expression<Func<Product, bool>> OnSale = (p) => p.IsOnSale;
Expression<Func<Product, bool>> Blue = (p) => p.Color = Color.Blue;
Expression<Func<Product, bool>> InStock = (p) => p.Quantity > 0;
....
Run Code Online (Sandbox Code Playgroud)
然后使用这些谓词过滤我的集合:
Products.Where(OnSale).And(Blue).And(InStock);
Run Code Online (Sandbox Code Playgroud)
要么
Products.And(OnSale, Blue, InStock);
Run Code Online (Sandbox Code Playgroud)
所以我可以很容易地看到我正在返回的内容,我只定义了一次条件,如果任何条件发生变化,我可以更新谓词而不是每个地方都在做Where().
我怎么能做到这一点?我看了PredicateBuilder,但Linq.Expressions对我来说是全新的.
通过使用字典来识别最常使用的单词,但是给定文本文件,可以很容易地计算文件中单词的出现次数,如何找到常用短语,其中"短语"是两个或更多个连续的集合话?
例如,以下是一些示例文本:
除口头遗嘱外,每一份遗嘱均为书面形式,但可以是手写或打字.遗嘱应包含遗嘱人的签名 或其他人在遗嘱人的有意识的存在 和立遗嘱人的明确指示下.遗嘱应由立遗嘱人在有意识的存在下,由两名或多名主管证人进行证明和认购,他们看到立遗嘱人认购,或听取立遗嘱人确认立遗嘱人的签名.
出于本节的目的,有意识的存在意味着在任何立遗嘱人的感官范围内,不包括通过电话,电子或其他远程通信感知的视觉或声音.
我怎样才能识别出"有意识存在"(3次)和"立遗嘱人签名"(2次)的短语不止一次出现(除了蛮力搜索每一组两三个单词)?
我将用c#编写这个,所以c#代码会很棒,但是我甚至无法确定一个好的算法,所以我会解决任何代码甚至伪代码以解决这个问题.
我有一组需要一次又一次并行处理的项目.
我可以做这个:
while (true)
{
Parallel.ForEach(sources, source =>
{
// do lots of work with source
})
}
Run Code Online (Sandbox Code Playgroud)
但问题是,如果一个源比其他源需要更长的时间,它将有效地挂起while循环,我想重新处理列表中的每个项目,而无需等待其他项目完成.
我怎么能做到这一点?为每个拥有循环的源代码启动任务,还是有更优雅的方式来执行此操作?
c# ×5
linq ×3
asp.net ×2
algorithm ×1
async-await ×1
collections ×1
dom ×1
javascript ×1
partitioning ×1
queue ×1
round-robin ×1
sql ×1
text ×1
webforms ×1