通常我想检查提供的值是否与列表中的值匹配(例如,在验证时):
if (!acceptedValues.Any(v => v == someValue))
{
// exception logic
}
Run Code Online (Sandbox Code Playgroud)
最近,我注意到ReSharper要求我将这些查询简化为:
if (acceptedValues.All(v => v != someValue))
{
// exception logic
}
Run Code Online (Sandbox Code Playgroud)
显然,这在逻辑上是相同的,可能稍微更具可读性(如果你已经做了很多数学),我的问题是:这是否会导致性能下降?
它感觉应该是这样(即.Any()听起来像是短路,而.All()听起来不是这样),但我没有任何证据证明这一点.有没有人更深入地了解查询是否会解决相同的问题,或者ReSharper是否让我误入歧途?
似乎在.NET Framework中,覆盖方法时可选参数存在问题.下面代码的输出是:"bbb""aaa".但我期待的输出是:"bbb""bbb".有解决方案.我知道它可以用方法重载解决,但想知道原因.此外,代码在Mono中运行良好.
class Program
{
class AAA
{
public virtual void MyMethod(string s = "aaa")
{
Console.WriteLine(s);
}
public virtual void MyMethod2()
{
MyMethod();
}
}
class BBB : AAA
{
public override void MyMethod(string s = "bbb")
{
base.MyMethod(s);
}
public override void MyMethod2()
{
MyMethod();
}
}
static void Main(string[] args)
{
BBB asd = new BBB();
asd.MyMethod();
asd.MyMethod2();
}
}
Run Code Online (Sandbox Code Playgroud) 如何在下面的代码中更改LINQ查询,按日期降序排序(最新的,最早的,最后一个)?
using System;
using System.Linq;
using System.Collections.Generic;
namespace Helloworld
{
class MainClass
{
public static void Main (string[] args)
{
List<Envelops> env = new List<Envelops> ();
Envelops e = new Envelops { ReportDate = DateTime.Now };
env.Add (e);
e = new Envelops { ReportDate = DateTime.Now.AddDays (5) };
env.Add (e);
e = new Envelops { ReportDate = new DateTime (2011, 3, 3) };
env.Add (e);
e = new Envelops { ReportDate = DateTime.Now };
env.Add (e);
foreach (Envelops r in …Run Code Online (Sandbox Code Playgroud) 最好做的是:
variable1Type foo;
variable2Type baa;
foreach(var val in list)
{
foo = new Foo( ... );
foo.x = FormatValue(val);
baa = new Baa();
baa.main = foo;
baa.Do();
}
Run Code Online (Sandbox Code Playgroud)
要么:
foreach(var val in list)
{
variable1Type foo = new Foo( ... );
foo.x = FormatValue(val);
variable2Type baa = new Baa();
baa.main = foo;
baa.Do();
}
Run Code Online (Sandbox Code Playgroud)
问题是:什么是更快的1例或2例?区别是微不足道的吗?它在实际应用中是否相同?这可能是一个优化微观,但我真的想知道哪个更好.
我不太了解RAM和HDD架构,或者电子如何处理内存块,但这总是引起我的好奇心:为什么我们选择停在8位以获得计算机值中的最小元素?
我的问题可能看起来很愚蠢,因为答案很明显,但我不太确定......
是因为2 ^ 3允许它在寻址内存时非常适合吗?电子产品是否专门设计用于存储8位块?如果是,为什么不使用更广泛的词?这是因为它除了32,64和128,所以处理器的单词可以给出几个单词?这么小的空间有256个值是否方便?
你怎么看 ?
我的问题有点过于形而上学,但我想确保这只是一个历史原因,而不是技术或数学原因.
对于这个轶事,我也在考虑ASCII标准,其中大多数首字母对UTF-8这样的东西都没用,我也试着想一些更简单快速的字符编码......
我有一个C#客户端应用程序需要每15分钟检查一次Postgres数据库上的表.问题是我需要将此客户端安装到或多或少200个客户端,因此我需要在查询后关闭数据库连接.
我使用.Close()方法但是,如果我检查Postgres DB上的pg_stat_activity表,我可以看到连接仍处于IDLE状态.我该如何解决这个问题?是否有可能完全关闭连接?
谢谢,安德烈
我正在实现一个算法(SpookyHash),通过将指针转换为将任意数据视为64位整数(ulong*).(这是SpookyHash如何工作所固有的,重写不这样做不是一个可行的解决方案).
这意味着它最终可能会读取未在8字节边界上对齐的64位值.
在某些CPU上,这很好用.在某些情况下,它会非常缓慢.在其他情况下,它会导致错误(异常或不正确的结果).
因此,我有代码来检测未对齐的读取,并在必要时将数据块复制到8字节对齐的缓冲区,然后再进行处理.
但是,我自己的机器有Intel x86-64.这样可以很好地容忍未对齐的读取,如果我只是忽略对齐问题,它会提供更快的性能,就像x86一样.它还允许memcpy类似于memzero类似的方法处理64字节的块以进行另一次提升.这两项性能改进是相当可观的,足以促使这种优化远未过早.
所以.我有一个非常值得在某些芯片上进行的优化(对于这个问题,可能是两个最有可能运行此代码的芯片),但是会致命或者在其他芯片上表现更差.显然,理想的是检测我正在处理的是哪种情况.
一些进一步要求:
这是一个支持.NET或Mono的所有系统的跨平台库.因此,特定于给定OS的任何内容(例如,P /调用OS调用)都是不合适的,除非它可以在呼叫不可用时安全地降级.
假阴性(确定芯片在实际上是安全的时候对于优化是不安全的)是可以容忍的,误报不是.
昂贵的操作很好,只要它们可以完成一次,然后缓存结果.
该库已经使用了不安全的代码,因此没有必要避免这种情况.
到目前为止,我有两种方法:
首先是用以下内容初始化我的旗帜:
private static bool AttemptDetectAllowUnalignedRead()
{
switch(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"))
{
case "x86": case "AMD64": // Known to tolerate unaligned-reads well.
return true;
}
return false; // Not known to tolerate unaligned-reads well.
}
Run Code Online (Sandbox Code Playgroud)
另一个是因为用于避免未对齐读取所需的缓冲区复制是使用创建的stackalloc,并且因为在x86(包括32位模式下的AMD64)中,stackalloc64位类型有时可能会返回一个4字节对齐但不是8字节对齐,然后我可以告诉我不需要对齐解决方法,也不要再尝试它:
if(!AllowUnalignedRead && length != 0 && (((long)message) & 7) != 0) // Need to avoid unaligned reads.
{
ulong* buf = stackalloc ulong[2 * …Run Code Online (Sandbox Code Playgroud) 我有多个图像 - 保存为Base64字符串,现在我想调整这些图像的大小以获得它们的缩略图...
最好的是使用Javascript(Node-Server)调整它们的大小,但也可以使用php调整它们的大小.
提前致谢
我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?
谢谢.
我希望通过表的ID列检索表的最后一行.我目前使用的是什么:
var x = db.MyTable.OrderByDescending(d => d.ID).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有没有办法以更有效的速度获得相同的结果?