小编Grz*_*cki的帖子

关于收集的Foreach转换为IEnumerable工作比没有转换时慢?

今天我找到了一些我不太了解的东西.我在LinqPad(版本5)中获得了以下代码:

void Main()
{
    const int size = 5000000;
    List<Thing> things = Enumerable.Range(1, 5000000).Select(x => new Thing {Id = x}).ToList();

    var sw1 = Stopwatch.StartNew();
    foreach (var t in things)
        if(t.Id == size) break;
    sw1.ElapsedMilliseconds.Dump();

    var sw2 = Stopwatch.StartNew();
    IEnumerable<Thing> ienThings = things;
    foreach (var t in ienThings)
        if (t.Id == size) break;
    sw2.ElapsedMilliseconds.Dump();

}

class Thing
{
    public long Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

看起来第二个循环的时间是第一个循环的两倍.为什么这个简单的演员会产生这样的效果呢?我确信在幕后发生了一些简单的事情,我不知何故.

c# linq

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

为什么我不能绑定(**)运算符

在f#中我可以很容易地绑定(+)或(*)运算符.为什么我不能用(**)做同样的事情?

> let s = (+);;
val s : (int -> int -> int)

> let f = (**);;
  let f = (**);;
  ------------^^
C:\Users\mqrx84\AppData\Local\Temp\stdin(4,13): error FS0010: Incomplete structured construct at or before this point in binding
Run Code Online (Sandbox Code Playgroud)

f#

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

如何在Vsix扩展中执行dll bindingRedirect?

我有VS的扩展,应该使用Gmail api向我公司的某些用户发送邮件.在开发过程中,我遇到了一个常见问题,该System.Net.Http.Primitives版本在谷歌API中被搞砸了.

对此的常见解决方案bindingRedirect在app.config中将redirectall调用重定向到新的最新版本的库.如下所示:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

但是,当我的输出是Vsix包时,这似乎不起作用.生成的Vsix甚至没有app.config.

我知道一个解决方案,说添加bindingRedirectmachine.config文件但我的扩展名被其他人使用,我宁愿不强迫他们把东西放入他们的机器配置文件.

还有其他解决方案吗?

app-config google-api vsix

7
推荐指数
2
解决办法
918
查看次数

我可以使用null条件运算符而不是经典事件提升模式吗?

C#6.0添加了这个新的?.运算符,现在允许调用这样的事件:

someEvent?.Invoke(sender, args);
Run Code Online (Sandbox Code Playgroud)

现在,根据我的阅读,这个运算符保证someEvent被评估一次.使用这种调用而不是经典模式是否正确:

var copy = someEvent

if(copy != null)
  copy(sender, args)
Run Code Online (Sandbox Code Playgroud)

我知道某些情况下上面版本的模式需要额外的锁,但让我们假设最简单的情况.

.net c# events c#-6.0

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

如何在 VSPackage 中找到解决方案使用的版本控制系统

我是扩展 Visual Studio 的新手,我正在尝试寻找方法来查找当前解决方案使用的源代码管理系统。

我创建了 VsPackage 项目,并且能够IVsSolution通过IVsSolutionEvents.

在内部OnAfterSolutionOpen(或者可能是其他的,如果有其他选择)我想根据解决方案是使用 TFS 还是 Git 或其他东西来采取不同的行动。我怎样才能获得这些信息?

我计划支持尽可能多的 Visual Studio 版本,但如果不可能,我希望至少支持 VS2012 及更高版本。

c# version-control vspackage visual-studio-extensions

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

ToString为单位值()抛出NullReferenceException

假设我们有一个非常简单的功能

let fn a = a.ToString()
Run Code Online (Sandbox Code Playgroud)

它的类型被推断为a -> string 但是,将单位值传递给函数会导致NullReferenceException.

在如上所述的简单函数的情况下,这可能很容易解决,但我实际上是在一个更复杂的场景中:

let eitherToHttp e = 
    match e with
    | Either.Ok v ->        OK (v.ToString()) 
    | Either.Bad reason ->  reasonToErrorCode reason
Run Code Online (Sandbox Code Playgroud)

这种类型是Either<'a, RejectReason> -> WebPart(这里WebPartEither实际上无关紧要)

在一个场景的类型eEither<unit, RejectReason>函数抛出酷似在简单的场景.

我怎样才能以一种好的方式克服这个问题?是否应将类型推断为通用类型,如果事实上这不适用于所有类型?

generics f# type-inference

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

Visual Studio 2015中的Microsoft.VisualStudio.TeamFoundation.VersionControl.dll在哪里

我正在将自己的TFS日志记录扩展迁移到VS 2015并遇到许多依赖性问题.其中大多数我都可以通过安装Microsoft.TeamFoundationServer.ExtendedClient nuget包来摆脱它.

然而,仍有一个缺失的参考,VersionControlExt

versionControlExt =
                    _applicationObject.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt")
                    as VersionControlExt;
Run Code Online (Sandbox Code Playgroud)

根据文档,它位于Microsoft.VisualStudio.TeamFoundation.VersionControl.dll,但我根本找不到这个文件.有谁知道从哪里获取它或如何更改上面的代码,以使其与VS 2015一起使用?

我正在使用Visual Studio 2015 Professional,14.0.23107.0 D14REL版本.

vs-extensibility visual-studio-2015

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

f#match表达式 - "规则永远不会匹配"

我正在努力学习F#而且我已经到了一个我不明白我做错了什么的地方.我写了以下代码:

let p = 0.2::0.2::0.2::0.2::0.2::[]
let world = "g"::"r"::"r"::"g"::"g"::[]
let measurements = "r"::"g"::[]
let pHit = 0.6
let pMiss = 0.2

let rec sense world probs measurement = 
    match world, probs with
    | measurement::row, p::rop -> (p*pHit)::sense row rop measurement
    | _::row, p::rop -> (p*pMiss)::sense row rop measurement
    | [],_ -> []
    | _,[] -> []
Run Code Online (Sandbox Code Playgroud)

我得到的问题是编译器告诉我匹配表达式的第二个规则永远不会匹配.我想用第二个规则表达的是,当"世界"列表的头部与测量值不同时,我们将在示例中进行如下计算.

有人能给我一个暗示吗?

f#

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