小编Jon*_*nna的帖子

LINQ:不是所有人都不要

通常我想检查提供的值是否与列表中的值匹配(例如,在验证时):

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 c# linq resharper performance

261
推荐指数
8
解决办法
7万
查看次数

重写方法的C#可选参数

似乎在.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)

.net c# overriding optional-parameters

71
推荐指数
6
解决办法
2万
查看次数

LINQ orderby在日期字段中按降序排列

如何在下面的代码中更改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)

c# linq

32
推荐指数
3
解决办法
11万
查看次数

在循环内部或外部声明变量是否更好?

最好做的是:

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例?区别是微不足道的吗?它在实际应用中是否相同?这可能是一个优化微观,但我真的想知道哪个更好.

.net c# scope

31
推荐指数
1
解决办法
1万
查看次数

为什么计算机科学中有8个和256个如此重要的数字?

我不太了解RAM和HDD架构,或者电子如何处理内存块,但这总是引起我的好奇心:为什么我们选择停在8位以获得计算机值中的最小元素?

我的问题可能看起来很愚蠢,因为答案很明显,但我不太确定......

是因为2 ^ 3允许它在寻址内存时非常适合吗?电子产品是否专门设计用于存储8位块?如果是,为什么不使用更广泛的词?这是因为它除了32,64和128,所以处理器的单词可以给出几个单词?这么小的空间有256个值是否方便?

你怎么看 ?

我的问题有点过于形而上学,但我想确保这只是一个历史原因,而不是技术或数学原因.

对于这个轶事,我也在考虑ASCII标准,其中大多数首字母对UTF-8这样的东西都没用,我也试着想一些更简单快速的字符编码......

memory math ram history processor

19
推荐指数
3
解决办法
7007
查看次数

关闭后连接仍然空闲

我有一个C#客户端应用程序需要每15分钟检查一次Postgres数据库上的表.问题是我需要将此客户端安装到或多或少200个客户端,因此我需要在查询后关闭数据库连接.

我使用.Close()方法但是,如果我检查Postgres DB上的pg_stat_activity表,我可以看到连接仍处于IDLE状态.我该如何解决这个问题?是否有可能完全关闭连接?

谢谢,安德烈

c# postgresql npgsql

15
推荐指数
1
解决办法
5779
查看次数

检测CPU对齐要求

我正在实现一个算法(SpookyHash),通过将指针转换为将任意数据视为64位整数(ulong*).(这是SpookyHash如何工作所固有的,重写不这样做不是一个可行的解决方案).

这意味着它最终可能会读取未在8字节边界上对齐的64位值.

在某些CPU上,这很好用.在某些情况下,它会非常缓慢.在其他情况下,它会导致错误(异常或不正确的结果).

因此,我有代码来检测未对齐的读取,并在必要时将数据块复制到8字节对齐的缓冲区,然后再进行处理.

但是,我自己的机器有Intel x86-64.这样可以很好地容忍未对齐的读取,如果我只是忽略对齐问题,它会提供更快的性能,就像x86一样.它还允许memcpy类似于memzero类似的方法处理64字节的块以进行另一次提升.这两项性能改进是相当可观的,足以促使这种优化远未过早.

所以.我有一个非常值得在某些芯片上进行的优化(对于这个问题,可能是两个最有可能运行此代码的芯片),但是会致命或者在其他芯片上表现更差.显然,理想的是检测我正在处理的是哪种情况.

一些进一步要求:

  1. 这是一个支持.NET或Mono的所有系统的跨平台库.因此,特定于给定OS的任何内容(例如,P /调用OS调用)都是不合适的,除非它可以在呼叫不可用时安全地降级.

  2. 假阴性(确定芯片在实际上是安全的时候对于优化是不安全的)是可以容忍的,误报不是.

  3. 昂贵的操作很好,只要它们可以完成一次,然后缓存结果.

  4. 该库已经使用了不安全的代码,因此没有必要避免这种情况.

到目前为止,我有两种方法:

首先是用以下内容初始化我的旗帜:

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)

.net c# mono processor

14
推荐指数
1
解决办法
757
查看次数

调整base64图像的大小

我有多个图像 - 保存为Base64字符串,现在我想调整这些图像的大小以获得它们的缩略图...

最好的是使用Javascript(Node-Server)调整它们的大小,但也可以使用php调整它们的大小.

提前致谢

php base64 resize image node.js

13
推荐指数
2
解决办法
2万
查看次数

"打开连接"究竟意味着什么?

我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?

谢谢.

c# idisposable resource-management idbconnection

11
推荐指数
1
解决办法
2502
查看次数

使用EF4获取SQL表的最后一行的最有效方法是什么?

我希望通过表的ID列检索表的最后一行.我目前使用的是什么:

var x = db.MyTable.OrderByDescending(d => d.ID).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

有没有办法以更有效的速度获得相同的结果?

c# linq entity-framework entity-framework-4

9
推荐指数
1
解决办法
507
查看次数