小编Ðаn*_*Ðаn的帖子

我应该在LINQ查询中使用两个"where"子句或"&&"吗?

在编写具有多个"和"条件的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)

是否有任何差别比之间的个人喜好或编码风格(排长队,可读性等)等positiveEvensApositiveEvensB

想到的一个可能的区别是,不同的LINQ提供者可能能够更好地处理多个wheres而不是更复杂的表达; 这是真的?

.net c# linq

70
推荐指数
4
解决办法
3万
查看次数

用于查找给定字符串的下一个更大排列的算法

我想要一个有效的算法来找到给定字符串的下一个更大的排列.

algorithm

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

获得下一个最小的双号

作为单元测试的一部分,我需要测试一些边界条件.一种方法接受一个System.Double参数.

有没有办法获得下一个最小的双值?(即将尾数减1个单位值)?

我考虑使用,Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 - Double.Epsilon == 9999999999).

那么所需的算法或代码是什么:

NextSmallest(Double d) < d
Run Code Online (Sandbox Code Playgroud)

......总是如此.

c# double epsilon ieee-754 floating-point-precision

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

如何在C#中接近不可为空的引用类型?

我读过很多不可空的问题和答案.看起来在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的内容有所了解,因为它至少已经有了部分解决方案.

.net c# c++-cli non-nullable

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

使用`async` lambda与`Task.Run()`冗余?

我刚刚遇到了一些代码:

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# asynchronous task

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

如何在本机.NET类中包装COM对象?

我在.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)

.net c# com interop com-interop

16
推荐指数
2
解决办法
3125
查看次数

无效修订:Android Studio 中的 3.18.1 CMake

这不是一个问题,它是我遇到的 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)

希望有帮助!

android version cmake

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

null对象与空对象

[这是最佳实践的结果:函数应该返回null还是空对象?但我想要非常一般.]

在很多传统的(嗯...生产)C++代码,我所看到的,有写的倾向大量NULL(或类似)的检查,以测试指针.在添加NULL时,许多这些都会在发布周期结束时添加 - 检查可以快速解决由指针取消引用导致的崩溃问题 - 而且没有太多时间进行调查.

为了解决这个问题,我开始编写带有(const)引用参数的代码,而不是传递指针的(更多)常见技术.没有指针,没有检查NULL的愿望(忽略实际具有空引用的角落情况).

在C#中,存在相同的C++"问题":希望检查针对null(ArgumentNullException)的每个未知引用并NullReferenceException通过添加null检查来快速修复s .

在我看来,防止这种情况的一种方法是首先使用空对象(String.Empty,EventArgs.Empty)来避免空对象.另一个是抛出异常而不是返回null.

我刚刚开始学习F#,但看起来在那个环境中有更少的空对象.那么也许你真的不需要有很多null参考文献?

我在这里吠叫错了吗?

c# c++ null

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

显示处理器速度

我有一台带有AMD Opteron(tm)处理器246的服务器和一个定制的Linux内核(2.6.9-100.ELhugemem).当我使用时检查处理器时dmidecode,它显示的速度为2000 MHz,而/proc/cpuinfo速度为1000 MHz.任何人都可以解释这个并给我一个检查当前CPU速度的方法吗?

linux

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

是否有将二进制数据打包成UTF-16字符串的标准技术?

(在.NET中)我将任意二进制数据存储在byte [](例如图像)中.现在,我需要将该数据存储在字符串中(遗留API的"注释"字段).是否有将二进制数据打包字符串的标准技术?通过"打包",我的意思是对于任何合理大的随机数据集,bytes.Length/2packed.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)

在这种情况下,bytesutf16_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字符之前的转义; 它有效,但我想知道是否有一种比我自己制作的更标准的技术.更何况,我不喜欢 …

.net unicode binary encoding utf-16

10
推荐指数
2
解决办法
3077
查看次数