我有两个集合a和b.我想计算a或者b两者中的项目集合,而不是两者中的项目集合(逻辑异或).有了LINQ,我可以想出这个:
IEnumerable<T> Delta<T>(IEnumerable<T> a, IEnumerable<T> b)
{
return a.Except (b).Union (b.Except (a));
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否还有其他更有效或更紧凑的方法来产生两个集合之间的差异.
编辑1:Jon Skeet发布了第一个解决方案,它不依赖于a来保留项目的顺序HashSet.我想知道是否有其他方法可以保持输出的顺序a和b输出.
我在我的(巨大的).NET 4项目中遇到了一个奇怪的行为.在代码中的某个时刻,我指的是一个完全限定的类型,比如说:
System.Type type = typeof (Foo.Bar.Xyz);
Run Code Online (Sandbox Code Playgroud)
稍后,我这样做:
System.Type type = System.Type.GetType ("Foo.Bar.Xyz");
Run Code Online (Sandbox Code Playgroud)
然后我回来了null.我无法理解为什么会发生这种情况,因为我的类型名称是正确的,我已经检查过其他类型并且它们得到了正确的解决.此外,以下LINQ查询查找类型:
var types = from assembly in System.AppDomain.CurrentDomain.GetAssemblies ()
from assemblyType in assembly.GetTypes ()
where assemblyType.FullName == typeName
select assemblyType;
System.Type type = types.FirstOrDefault ();
Run Code Online (Sandbox Code Playgroud)
有什么理由System.Type.GetType可以失败吗?
我终于不得不求助于这段代码而不是GetType:
System.Type MyGetType(string typeName)
{
System.Type type = System.Type.GetType (typeName);
if (type == null)
{
var types = from assembly in System.AppDomain.CurrentDomain.GetAssemblies ()
from assemblyType in assembly.GetTypes ()
where assemblyType.FullName == typeName
select assemblyType;
type …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试SignalR集线器,并注意到即使使用单个客户端,构造函数也会被多次调用.这是预期的行为吗?我期待构造函数只被调用一次用于类初始化,但我多次击中断点.
例如,我已经成功开发并部署了ClickOnce应用程序,该应用程序注册了相关的文件扩展名*.abc.当我单击命名文件x.abc或x.abc从命令提示符处键入时,ClickOnce应用程序启动,我可以通过专用API检索文件.我还可以使用以下代码以编程方式启动应用程序:
System.Diagnostics.Process.Start ("x.abc");
Run Code Online (Sandbox Code Playgroud)
我的Windows Vista 64位盒上的一切正常.
但是,如果我尝试在Windows 7(也是64位)上做同样的事情,我有一个非常奇怪的问题.这是我观察到的:
x.abc从资源管理器中双击手动启动.x.abc从命令提示符手动启动工作.Process.Start("x.abc")没有启动申请; 但是,返回的进程对象显示没有错误,并且ClickOnce应用程序以某种方式立即退出.但即使是Trace在ClickOnce应用程序的最开始,也永远不会到达.Process.Start("x.bat")的文件也无法启动ClickOnce应用程序!同样从Explorer工作开始(当然).x.batx.abcx.bat试图分析发生的事情ProcMon并不是很有帮助,因为从我的观点来看,启动应用程序的ClickOnce过程非常难以遵循.我观察rundll32到上班,但没有任何失败的证据.
正在执行的程序Process.Start是一个完全信任的控制台应用程序,真的没什么特别的.
我无法看到在Windows 7上处理ClickOnce应用程序的方式发生了哪些变化,为什么Process.Start与从Explorer中启动文件完全相同.值得一提的是,使用该Start方法的更高级版本ProcessStartInfo并设置UseShellExecute为true无效.
开始cmd使用Process.Start,然后尝试推出x.abc正好显示了同样的问题.如果我将环境设置与cmd手动启动进行比较,我会看到如何ProgramFiles定义的差异(第一个指向C:\Program Files (x86)而第二个指向C:\Program Files).从我的.NET应用程序启动的应用程序是在32位仿真层(SysWoW64)上启动的.
我能够x.abc通过启动32位版本的命令提示符(即,%windir%\SysWoW64\cmd.exe)然后x.abc在提示符下键入来重现启动失败.我还发现了一个丑陋的解决方法,即通过启动%windir%\Sysnative\cmd.exe /C x.abc而不是从32位环境启动64位命令提示符x.abc. …
使用Nancy FX时,我遇到了以下在尝试启动Web服务时抛出的异常: AutomaticUrlReservationCreationFailureException
仔细研究了一下后,我发现解决这个问题的方法是运行cmd提示符(作为管理员),然后运行以下命令:
netsh http add urlacl url=http://+:1234/ user=DOMAIN\username
Run Code Online (Sandbox Code Playgroud)
哪里
DOMAIN\username 是服务将在其下运行的用户的ID1234 是服务将运行的端口我在这里写这篇文章是为了防止其他人遇到同样的问题而花半个小时左右的时间寻找答案 - 希望他们能比我更快找到这个!
我发现了一篇关于如何通过调用来提升用C++编写的COM对象
的文章CoCreateInstanceAsAdmin.但是我无法找到或做的是将.NET(c#)应用程序的一个组件实现为COM对象,然后调用该对象来执行需要UAC提升的任务.MSDN将此文档记录为管理COM对象模型.
我知道以管理员身份启动应用程序(或其他应用程序)是可行且非常容易的,以便在单独的过程中执行任务(例如参见Daniel Moth的帖子,但我正在寻找的是一种方式从同一个未提升的.NET可执行文件中做所有事情.当然,这样做会在新进程中生成COM对象,但是由于透明的编组,.NET COM对象的调用者不应该(也是很多)意识到这一点.
关于如何使用C#,C#项目,通过CoCreateInstanceAsAdminAPI 实现C#编写的COM对象的任何想法都会非常有用.所以我真的很想学习如何在C#中编写COM对象,然后我可以通过COM高程API从C#调用它.
不要紧,升高的COM对象是否在同一进程中运行.我只是不想要提升整个应用程序; 我想要提升将执行代码的COM对象.如果我能写出一些东西:
// in a dedicated assembly, marked with the following attributes:
[assembly: ComVisible (true)]
[assembly: Guid ("....")]
public class ElevatedClass
{
public void X() { /* do something */ }
}
Run Code Online (Sandbox Code Playgroud)
然后让我的主应用程序ElevatedClass通过CoCreateInstanceAsAdmin调用实现.但也许我只是在做梦.
在工作中,我们有使用4个空格进行代码缩进的约定.我习惯于使用tabs缩进,但想遵循惯例.
注意:我不打算在这里开始讨论空格与标签.
我调整了我的Visual Studio设置以用4个空格替换选项卡,但我有一些问题调整为使用空格.
例如:
如何轻松取消缩进代码?对于tab字符,我只需要使用backspace一次,我需要使用backspace
4次空格.
如何确保始终有正确数量的空间(不是三个或五个)?
如何使用标签尽可能快地浏览我的代码?(向左或向右箭头跳转到带有制表符的下一个缩进,但只移动一个带空格的位置)
比较文件时如何忽略空格更改?
理想情况下,我希望这些用于缩进的4个空格能够同等地用于制表符.
我主要使用c#和基于XML的文件.
欢迎任何提示!
我正在寻找类似于Debugger.Launch().NET的东西,它以编程方式打入调试器.
我不是在寻找一种跨浏览器的方式,只需谷歌Chrome就足够了.
我有一个混合的环境,一些开发人员正在开发Visual Studio 2013,其他人正在研究2015年.在我们从Visual Studio 2015更新引用的NuGet包之前,一切正常.
现在,当尝试从Visual Studio 2013恢复NuGet包时,我看到以下错误:
项目Foo的NuGet包恢复失败:'System.Linq 4.0.0'包需要NuGet客户端版本'3.0'或更高版本,但当前的NuGet版本是'2.8.60723.765'..
显然,Visual Studio 2013没有NuGet版本3.x.
是否有继续使用Visual Studio 2013和2015的解决方案?
nuget visual-studio-2013 nuget-package-restore visual-studio-2015
我想确定我的程序是否在Windows Server的某个版本上运行.显然,System.Environment不包含有关Windows是服务器版本的事实的信息(OS版本对象中没有此类信息).
我知道我可以SystemInformation.TerminalServerSession用来检查我的程序是否在远程桌面上运行(另请参阅此问题),但如果用户只是远程访问普通客户端Windows机器,情况也是如此.
那么是否有一种支持的方法来确定代码是在服务器上还是在客户端计算机上运行?如果需要,我不介意使用P/Invoke.
注意:我不想"Server"在产品名称中搜索字符串,因为由于本地化,这可能不适用于某些系统.
c# ×5
.net ×1
assemblies ×1
clickonce ×1
clr ×1
com ×1
elevation ×1
gettype ×1
ienumerable ×1
javascript ×1
linq ×1
moniker ×1
nancy ×1
netsh ×1
nuget ×1
set-theory ×1
signalr ×1
signalr-hub ×1
types ×1
uac ×1
windows-7 ×1
xml ×1