在编写具有多个"和"条件的LINQ查询时,我应该编写where包含&&多个where子句的单个子句,每个条件一个吗?
static void Main(string[] args)
{
var ints = new List<int>(Enumerable.Range(-10, 20));
var positiveEvensA = from i in ints
where (i > 0) && ((i % 2) == 0)
select i;
var positiveEvensB = from i in ints
where i > 0
where (i % 2) == 0
select i;
System.Diagnostics.Debug.Assert(positiveEvensA.Count() ==
positiveEvensB.Count());
}
Run Code Online (Sandbox Code Playgroud)
是否有任何差别比之间的个人喜好或编码风格(排长队,可读性等)等positiveEvensA和positiveEvensB?
想到的一个可能的区别是,不同的LINQ提供者可能能够更好地处理多个wheres而不是更复杂的表达; 这是真的?
作为单元测试的一部分,我需要测试一些边界条件.一种方法接受一个System.Double参数.
有没有办法获得下一个最小的双值?(即将尾数减1个单位值)?
我考虑使用,Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 - Double.Epsilon == 9999999999).
那么所需的算法或代码是什么:
NextSmallest(Double d) < d
Run Code Online (Sandbox Code Playgroud)
......总是如此.
我读过很多不可空的问题和答案.看起来在C#(4.0)中接近不可空类型的最佳方法是Jon Skeet的NonNullable <> hack.
但是,似乎C++/CLI通过支持托管引用解决了大部分问题:( Foo%而不是本机C++ Foo&).编译器通过添加modreq(IsImplicitlyDereferenced)参数来完成此工作.试图从C#调用这样的函数会导致:
'<FunctionName>' is not supported by the language
Run Code Online (Sandbox Code Playgroud)
有没有比NonNullable <>更好的东西?
有没有办法(合理地 - 即,没有使用反射)Foo::Method(Bar%)从C#调用C++/CLI方法?
[编辑]似乎目前没有比NonNullable <>更好的了......我希望我能对C++/CLI的内容有所了解,因为它至少已经有了部分解决方案.
我刚刚遇到了一些代码:
var task = Task.Run(async () => { await Foo.StartAsync(); });
task.Wait();
Run Code Online (Sandbox Code Playgroud)
(不,我不知道其内部运作方式Foo.StartAsync()).我最初的反应是摆脱async/ await并重写为:
var task = Foo.StartAsync();
task.Wait();
Run Code Online (Sandbox Code Playgroud)
这是否正确(再一次,一无所知Foo.StartAsync()). 这个答案与它有什么不同 - 用Task.Run运行'异步'动作委托......似乎表明可能存在可能有意义的情况,但它也说"说实话,我没有"看到很多场景......"
我在.NET(C#)中使用了广泛的现有COM API(可能是Outlook,但它不是).我通过在Visual Studio中添加"COM引用"来完成此操作,因此所有"魔法"都是在幕后完成的(即,我不必手动运行tlbimp).
虽然现在可以从.NET"轻松"使用COM API,但它不是非常友好的.NET.例如,没有泛型,事件很奇怪,奇怪,如IPicture等.所以,我想创建一个使用现有COM API实现的本机.NET API.
一个简单的第一次传球可能是
namespace Company.Product {
class ComObject {
public readonly global::Product.ComObject Handle; // the "native" COM object
public ComObject(global::Product.ComObject handle) {
if (handle == null) throw new ArgumentNullException("handle");
Handle = handle;
}
// EDIT: suggestions from nobugz
public override int GetHashCode() {
return Handle.GetHashCode();
}
public override bool Equals(object obj) {
return Handle.Equals(obj);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的一个直接问题是,您可以轻松地为同一个底层"本机COM"对象结束多个ComObject实例.例如,在进行枚举时:
IEnumerable<Company.Product.Item> Items {
get {
foreach (global::Item item in Handle.Items)
yield …Run Code Online (Sandbox Code Playgroud) 这不是一个问题,它是我遇到的 android studio 技术问题的解决方案。如果有人遇到错误,我将分享我的做法以修复错误。简短的错误消息是:"Invalid revision: 3.18.1-g262b901",而 3.18.1 是 Android Studio 中最新的 CMake 版本。但问题是我的项目很旧,并且使用此 CMake 版本构建失败。有2个解决方案,您可以选择2个中的1个: - Remove(uninstall) CMake version 3.18.1:点击Android Studio->Preferences->Appearance & Behavior->System Settings->Android SDK->SDK Tool->(enable Show Package Details 复选框)->CMake->Uncheck 3.18.1 复选框,然后单击对话框右下角的 Apply 按钮。-设置目录路径通过将这一行添加到此文件中,在 local.properties 文件中使用较低版本的 CMake :(CMake 路径在您的计算机中可能不同)cmake.dir=/Users/admin/Library/Android/sdk/cmake/3.10.2.4988404
长错误信息(一小部分):
*
at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94)
at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
Caused by: java.lang.NumberFormatException: Invalid revision: 3.18.1-g262b901
at com.android.repository.Revision.parseRevision(Revision.java:133)
at com.android.repository.Revision.parseRevision(Revision.java:155)
at com.android.build.gradle.external.cmake.CmakeUtils.getVersion(CmakeUtils.java:51)
at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.createCmakeExternalNativeJsonGenerator(ExternalNativeJsonGenerator.java:688)
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
[这是最佳实践的结果:函数应该返回null还是空对象?但我想要非常一般.]
在很多传统的(嗯...生产)C++代码,我所看到的,有写的倾向大量的NULL(或类似)的检查,以测试指针.在添加NULL时,许多这些都会在发布周期结束时添加 - 检查可以快速解决由指针取消引用导致的崩溃问题 - 而且没有太多时间进行调查.
为了解决这个问题,我开始编写带有(const)引用参数的代码,而不是传递指针的(更多)常见技术.没有指针,没有检查NULL的愿望(忽略实际具有空引用的角落情况).
在C#中,存在相同的C++"问题":希望检查针对null(ArgumentNullException)的每个未知引用并NullReferenceException通过添加null检查来快速修复s .
在我看来,防止这种情况的一种方法是首先使用空对象(String.Empty,EventArgs.Empty)来避免空对象.另一个是抛出异常而不是返回null.
我刚刚开始学习F#,但看起来在那个环境中有更少的空对象.那么也许你真的不需要有很多null参考文献?
我在这里吠叫错了吗?
我有一台带有AMD Opteron(tm)处理器246的服务器和一个定制的Linux内核(2.6.9-100.ELhugemem).当我使用时检查处理器时dmidecode,它显示的速度为2000 MHz,而/proc/cpuinfo速度为1000 MHz.任何人都可以解释这个并给我一个检查当前CPU速度的方法吗?
(在.NET中)我将任意二进制数据存储在byte [](例如图像)中.现在,我需要将该数据存储在字符串中(遗留API的"注释"字段).是否有将二进制数据打包成字符串的标准技术?通过"打包",我的意思是对于任何合理大的随机数据集,bytes.Length/2与packed.Length大致相同; 因为两个字节或多或少是一个字符.
这两个"明显"的答案不符合所有标准:
string base64 = System.Convert.ToBase64String(bytes)
Run Code Online (Sandbox Code Playgroud)
没有非常有效地使用字符串,因为它只使用大约60,000个可用的64个字符(我的存储是System.String).一起去
string utf16 = System.Text.Encoding.Unicode.GetString(bytes)
Run Code Online (Sandbox Code Playgroud)
更好地利用字符串,但它不适用于包含无效Unicode字符的数据(例如错误匹配的代理项对). 这篇MSDN文章展示了这种精确(差)技术.
我们来看一个简单的例子:
byte[] bytes = new byte[] { 0x41, 0x00, 0x31, 0x00};
string utf16 = System.Text.Encoding.Unicode.GetString(bytes);
byte[] utf16_bytes = System.Text.Encoding.Unicode.GetBytes(utf16);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,bytes和utf16_bytes是相同的,因为原始字节是UTF-16字符串.使用base64编码执行相同的过程会产生16个成员的base64_bytes数组.
现在,使用无效的UTF-16数据重复该过程:
byte[] bytes = new byte[] { 0x41, 0x00, 0x00, 0xD8};
Run Code Online (Sandbox Code Playgroud)
您会发现utf16_bytes与原始数据不匹配.
我编写的代码使用U + FFFD作为无效Unicode字符之前的转义; 它有效,但我想知道是否有一种比我自己制作的更标准的技术.更何况,我不喜欢 …