小编Chi*_*Chi的帖子

使用LINQ检查列表是否为空

什么是"最佳"(考虑到速度和可读性)的方式来确定列表是否为空?即使列表是类型IEnumerable<T>且没有Count属性.

现在我在这之间折腾:

if (myList.Count() == 0) { ... }
Run Code Online (Sandbox Code Playgroud)

还有这个:

if (!myList.Any()) { ... }
Run Code Online (Sandbox Code Playgroud)

我的猜测是第二个选项更快,因为它会在看到第一个项目后立即返回结果,而第二个选项(对于IEnumerable)将需要访问每个项目以返回计数.

话虽如此,第二个选项看起来是否可读?你更喜欢哪个?或者你能想出一个更好的方法来测试空列表吗?

编辑 @ lassevk的响应似乎是最合乎逻辑的,再加上一些运行时检查,如果可能的话,使用缓存计数,如下所示:

public static bool IsEmpty<T>(this IEnumerable<T> list)
{
    if (list is ICollection<T>) return ((ICollection<T>)list).Count == 0;

    return !list.Any();
}
Run Code Online (Sandbox Code Playgroud)

.net c# linq list

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

在C#中进行浅拷贝的最快方法

我想知道在C#中进行浅层复制的最快方法是什么?我只知道有两种方法可以做浅拷贝:

  1. MemberwiseClone
  2. 逐个复制每个字段(手动)

我发现(2)比(1)快.我想知道是否还有另一种方法可以进行浅层复制?

c# shallow-copy cloning

54
推荐指数
6
解决办法
5万
查看次数

剃刀:声明性HTML助手

我正在尝试编写一个简单的声明性html帮助器:

@helper Echo(string input) {
    @input
}
Run Code Online (Sandbox Code Playgroud)

如果我将它嵌入我想要使用它的页面,帮助程序工作正常.但是如果我将它移动到一个单独的.cshtml文件并将该文件放在~/Views/Helpers目录中,我的视图就不能再编译了,因为找不到帮助器.根据Scott Gu 关于Razor博客文章,它应该有效.

我究竟做错了什么?

c# asp.net-mvc html-helper razor asp.net-mvc-3

48
推荐指数
5
解决办法
4万
查看次数

C#List - 循环/迭代时删除项目

假设我有以下代码片段:

var data=new List<string>(){"One","Two","Three"};
for(int i=0 ; i<data.Count ; i++){
  if(data[i]=="One"){
    data.RemoveAt(i);
  }
}
Run Code Online (Sandbox Code Playgroud)

以下代码抛出异常.

我的问题是什么是避免此异常并在循环时删除元素的最佳方法?

.net c# collections list

43
推荐指数
4
解决办法
6万
查看次数

保证多处理器系统上的多个线程始终可以看到变量的最新值

我正在使用这样的配置:

  • .NET framework 4.5
  • Windows Server 2008 R2
  • HP DL360p Gen8(2*Xeon E5-2640,x64)

我的程序中有这样的字段:

protected int HedgeVolume;
Run Code Online (Sandbox Code Playgroud)

我从几个线程访问此字段.我假设因为我有多处理器系统,所以这个线程可能在不同的处理器上执行.

我该怎么做才能保证在任何时候我使用这个字段的最新值是"读"?并确保当我"写"值时,它立即可用于所有其他线程?

我该怎么办?

  • 只是按原样离开现场.
  • 宣布它 volatile
  • 使用Interlocked类来访问该字段
  • 使用.NET 4.5 Volatile.Read,Volatile.Write访问该字段的方法
  • 使用 lock

我只需要最简单的方法让我的程序在这个配置上工作我不需要我的程序在另一台计算机或服务器或操作系统上工作.此外,我想要最小的延迟,所以我正在寻找最快的解决方案,它将始终适用于此标准配置(多处理器intel x64,.net 4.5).

.net c# multithreading

25
推荐指数
2
解决办法
1973
查看次数

检查列表中的所有值是否相等

Class order {
Guid Id;
int qty;
}
Run Code Online (Sandbox Code Playgroud)

使用LINQ表达式,如何验证qty列表中的所有订单是否相同?

提前致谢!

c# linq lambda

8
推荐指数
1
解决办法
6220
查看次数

数组引用不正确?JUnit工作不正常?

我试图用给定的数字移动数组中的所有值.例如,具有1个移位的阵列{1,2,3,4,5}必须变为{5,1,2,3,4}.这是使用JUnit测试的.

JUnit测试是这样的:

    @Test    
    public void shift1(){
        double[] row = {1.0,2.0,3.0,4.0,5.0};
        int amount= 1;
        ArrayOperations.shift(row, amount);
        Assert.assertEquals(5.0, row [0]);
        Assert.assertEquals(1.0, row [1]);
        Assert.assertEquals(2.0, row [2]);
        Assert.assertEquals(3.0, row [3]);
        Assert.assertEquals(4.0, row [4]);      
    }
Run Code Online (Sandbox Code Playgroud)

我的方法是这样的:

public static void shift(double[] row, int amount) {
    double[] newRow= new double[row.length];
    for (int i = 0; i < newRow.length; i++) {
        newRow[(i + amount) % row.length] = row[i];
    }

    row= newRow;
}
Run Code Online (Sandbox Code Playgroud)

现在这个测试因任何未知原因而失败.我在编程课上遇到了这个问题,甚至我的老师也没找到原因.当我调试它时,数组被正确修改,导致{5,1,2,3,4}.但是JUnit失败了...但是这段代码有效:

public static void shift(double[] row, int amount) { …
Run Code Online (Sandbox Code Playgroud)

java arrays junit pass-by-reference pass-by-value

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