什么是"最佳"(考虑到速度和可读性)的方式来确定列表是否为空?即使列表是类型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) 我想知道在C#中进行浅层复制的最快方法是什么?我只知道有两种方法可以做浅拷贝:
我发现(2)比(1)快.我想知道是否还有另一种方法可以进行浅层复制?
我正在尝试编写一个简单的声明性html帮助器:
@helper Echo(string input) {
@input
}
Run Code Online (Sandbox Code Playgroud)
如果我将它嵌入我想要使用它的页面,帮助程序工作正常.但是如果我将它移动到一个单独的.cshtml
文件并将该文件放在~/Views/Helpers
目录中,我的视图就不能再编译了,因为找不到帮助器.根据Scott Gu 关于Razor的博客文章,它应该有效.
我究竟做错了什么?
假设我有以下代码片段:
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)
以下代码抛出异常.
我的问题是什么是避免此异常并在循环时删除元素的最佳方法?
我正在使用这样的配置:
我的程序中有这样的字段:
protected int HedgeVolume;
Run Code Online (Sandbox Code Playgroud)
我从几个线程访问此字段.我假设因为我有多处理器系统,所以这个线程可能在不同的处理器上执行.
我该怎么做才能保证在任何时候我使用这个字段的最新值是"读"?并确保当我"写"值时,它立即可用于所有其他线程?
我该怎么办?
volatile
Interlocked
类来访问该字段Volatile.Read
,Volatile.Write
访问该字段的方法lock
我只需要最简单的方法让我的程序在这个配置上工作我不需要我的程序在另一台计算机或服务器或操作系统上工作.此外,我想要最小的延迟,所以我正在寻找最快的解决方案,它将始终适用于此标准配置(多处理器intel x64,.net 4.5).
Class order {
Guid Id;
int qty;
}
Run Code Online (Sandbox Code Playgroud)
使用LINQ表达式,如何验证qty
列表中的所有订单是否相同?
提前致谢!
我试图用给定的数字移动数组中的所有值.例如,具有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) c# ×6
.net ×3
linq ×2
list ×2
arrays ×1
asp.net-mvc ×1
cloning ×1
collections ×1
html-helper ×1
java ×1
junit ×1
lambda ×1
razor ×1
shallow-copy ×1