小编des*_*lsj的帖子

如何确保FirstOrDefault <KeyValuePair>已返回值

这是我正在尝试做的简化版本:

var days = new Dictionary<int, string>();
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");

var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));
Run Code Online (Sandbox Code Playgroud)

由于KeyValuePair变量中不存在'xyz',因此FirstOrDefault方法不会返回有效值.我希望能够检查这种情况,但我意识到我无法将结果与"null"进行比较,因为KeyValuePair是一个结构.以下代码无效:

if (day == null) {
    System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Run Code Online (Sandbox Code Playgroud)

我们尝试编译代码,Visual Studio会抛出以下错误:

Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Run Code Online (Sandbox Code Playgroud)

如何检查FirstOrDefault是否返回了有效值?

c# linq

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

从window.open返回一个值

我们最近发现Chrome不再支持window.showModalDialog,这是有问题的,因为我们的企业应用程序使用此方法.

显然,有一个短期解决方法可以让你恢复showModalDialog,但它涉及修改注册表,这对我们普通用户来说太复杂(而且有风险).因此,我不是这种解决方法的忠实粉丝.

长期解决方案显然是删除对这个过时方法的所有调用,并用一个方便的jQuery插件替换它们(例如VistaPrint的Skinny Modal Dialog插件.顺便提一句其他建议也是如此).

我们使用模态对话框的典型场景是在执行无法撤消的操作之前询问用户是/否确认,要求用户在继续操作之前同意条款和条件等.通常情况下onclick事件为"是"或模态对话框中的"确定"按钮如下所示:

window.returnValue = true;
window.close();
Run Code Online (Sandbox Code Playgroud)

同样,"取消"或"否"按钮如下所示:

window.returnValue = false;
window.close();
Run Code Online (Sandbox Code Playgroud)

我们可以从对话框中返回一个值的事实非常方便,因为它允许"父"窗口被通知用户是否单击了"确定"或"取消"按钮,如下所示:

var options = "center:1;status:1;menubar:0;toolbar:0;dialogWidth:875px;dialogHeight:650px";
var termsOfServiceAccepted = window.showModalDialog(myUrl, null, options);
if (termsOfServiceAccepted) {
    ... proceed ...
}
Run Code Online (Sandbox Code Playgroud)

我要提到的关于showModalDialog的最后一件事是,即使对话框中显示的文档来自不同的域,它也能很好地工作.让我们的javascript从http://the-client.com运行是很常见的,但"服务条款"网页来自http://the-enterprise-vendor.com

我需要一个临时解决方案,我可以在我们处理长期解决方案时尽快部署.这是我的标准:

  • 现有JavaScript中的代码更改最少
  • 弹出窗口必须能够将值返回给"父".通常这个值是布尔值,但它可以是任何简单类型(例如:string,int等)
  • 即使内容的URL来自不同的域,解决方案也必须正常工作

这是我到目前为止所拥有的:

1)在我的JavaScript中添加以下方法:

function OpenDialog(url, width, height, callback)
{
    var win = window.open(url, "MyDialog", width, height, "menubar=0,toolbar=0");
    var timer = setInterval(function ()
    {
        if (win.closed)
        {
            clearInterval(timer);
            var returnValue = win.returnValue;
            callback(returnValue);
        }
    }, 500);
}
Run Code Online (Sandbox Code Playgroud)

正如您在此方法中所看到的,我尝试通过隐藏菜单和工具栏使弹出窗口看起来尽可能类似于对话框,我每隔500毫秒设置一次时间来检查窗口是否已被用户关闭如果是这样,请获取'returnValue'并调用回调.

2)用以下内容替换对showModalDialog的所有调用: …

javascript google-chrome showmodaldialog

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

如何使用Agility Pack从HTML中删除注释而不会丢失DOCTYPE

我试图从HTML中删除不必要的内容.具体来说,我想删除评论.我发现了一个非常好的解决方案(使用HTML Agility Pack获取元标记和注释)但是DOCTYPE被视为注释,因此随注释一起删除.如何改进下面的代码以确保保留DOCTYPE?

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
var nodes = htmlDoc.DocumentNode.SelectNodes("//comment()");
if (nodes != null)
{
    foreach (HtmlNode comment in nodes)
    {
        comment.ParentNode.RemoveChild(comment);
    }
}
Run Code Online (Sandbox Code Playgroud)

html-agility-pack

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

模拟Task.Delay

我有一个方法,包括以下行: await Task.Delay(waitTime).ConfigureAwait(false);

我有一个很好的策略,可以避免在单元测试时等待几秒钟,而是确认我们试图等待特定的秒数.

例如,有没有办法在我的方法中注入一个额外的参数,就像在这个(人为的)示例中我注入一个虚构ITaskWaiter接口的模拟对象:

// Arrange
var mockWait = new Mock<ITaskWaiter>(MockBehavior.Strict);
mockWait.Setup(w => w.Delay(It.Is<TimeSpan>(t => t.TotalSeconds == 2)));

// Act
myObject.MyMethod(mockWait.Object);

// Assert
mockWait.Verify();
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq mocking

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

Microsoft nuget 软件包的发行说明在哪里?

Microsoft 是否发布单个 nuget 包的发行说明?

我注意到一些带有 'dot' 版本的 nuget 包(这让我相信一些错误已经解决),但我找不到关于这些 dot 版本中究竟修复了什么的信息。

以下是一些随机挑选的 Microsoft 发布的软件包示例:

大多数这些包的描述说发行说明可在https://go.microsoft.com/fwlink/?LinkID=799421上找到,但这是 .NET Core 1.1.0 Preview 1 发布 10/ 发行说明的链接24/2016,没有特定于软件包的内容。

为每个版本发布非常清晰的发行说明的 Microsoft nuget 包的一个示例是Windows Azure Storage

release-management nuget-package

7
推荐指数
0
解决办法
447
查看次数

如何诊断警告 MSB3277:发现无法解决的同一依赖程序集的不同版本之间存在冲突

我在构建项目时收到一个恼人的 MSB3277 警告。我将详细程度增加到“详细”,并且能够从日志中获取以下信息:

      There was a conflict between "Pathoschild.Http.Client, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" and "Pathoschild.Http.Client, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null".
         "Pathoschild.Http.Client, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "Pathoschild.Http.Client, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" was not.

         References which depend on "Pathoschild.Http.Client, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\desau\.nuget\packages\pathoschild.http.fluentclient\3.0.0\lib\netstandard1.3\Pathoschild.Http.Client.dll].
             C:\Users\desau\.nuget\packages\pathoschild.http.fluentclient\3.0.0\lib\netstandard1.3\Pathoschild.Http.Client.dll
               Project file item includes which caused reference "C:\Users\desau\.nuget\packages\pathoschild.http.fluentclient\3.0.0\lib\netstandard1.3\Pathoschild.Http.Client.dll".
                 C:\Users\desau\.nuget\packages\pathoschild.http.fluentclient\3.0.0\lib\netstandard1.3\Pathoschild.Http.Client.dll

         References which depend on "Pathoschild.Http.Client, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null" [].
             C:\Users\desau\.nuget\packages\stronggrid\0.30.0\lib\netstandard1.3\StrongGrid.dll
               Project file item includes which caused reference "C:\Users\desau\.nuget\packages\stronggrid\0.30.0\lib\netstandard1.3\StrongGrid.dll".
                 C:\Users\desau\.nuget\packages\stronggrid\0.30.0\lib\netstandard1.3\StrongGrid.dll
Run Code Online (Sandbox Code Playgroud)

如果我正确理解此日志,它会告诉我我的项目引用了 Pathoschild.Http.Client 3.0 版和 3.1 版。我理解对 3.1 版的引用,因为我的项目引用了一个名为 …

c# msbuild visual-studio

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

如何判断IPv6地址是否私有?

我试图确定给定的 IPv6 地址在 C# 中是否是私有的,并且我很想简单地使用 IPAddress 类上的“IsIPv6SiteLocal”属性。但是,正如此评论中所解释的,此属性中实现的逻辑已被弃用。我运行了以下单元测试:

[TestMethod]
public void IsPrivate_ipv6_True()
{
    // This sample private IPv6 address was generated using: http://unique-local-ipv6.com/
    var ip = IPAddress.Parse("fd44:fda4:e1ba::1");
    Assert.IsTrue(ip.IsIPv6SiteLocal);
}
Run Code Online (Sandbox Code Playgroud)

单元测试中的断言失败,这确认 IsIPv6SiteLocal 无法正确确定地址是否为本地地址。所以我需要一个替代方案。

我编写了以下扩展方法,我想知道是否有人能想到一种无法正确确定地址是私有/公共的场景。

public static bool IsPrivateIPv6(this IPAddress address)
{
    var addressAsString = address.ToString();
    var firstWord = addressAsString.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries)[0];

    // Make sure we are dealing with an IPv6 address
    if (address.AddressFamily != AddressFamily.InterNetworkV6) return false;

    // The original IPv6 Site Local addresses (fec0::/10) are deprecated. Unfortunately …
Run Code Online (Sandbox Code Playgroud)

c# ipv6

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

如何声明包含泛型类型的数组?

说我有以下类型:

public class Field<T>
{
  public string Name { get; set; }
  public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何声明包含此类字段数组的变量?我尝试了以下方法:

var customFields = new Field[]
{
    new Field<string> { Name = "nickname", Value = "Bob" },
    new Field<int> { Name = "age", Value = 42 },
    new Field<DateTime> { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};
Run Code Online (Sandbox Code Playgroud)

但我得到以下编译时异常:

使用泛型类型"Field"需要1个类型参数

我也试过,var customFields = new Field<object>[]但我得到以下错误:

无法隐式将"Field"类型转换为"Field"

无法隐式将"Field"类型转换为"Field"

无法隐式将"Field"类型转换为"Field"

c# generics

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

如何计算 HttpRequestMessage 的大小?

假设我有一个像这样构建的 HttpRequestMessage 对象:

var request = new HttpRequestMessage(HttpMethod.Post, uploadUrl)
{
    Content = new ObjectContent(myObject, new JsonMediaTypeFormatter())
};
Run Code Online (Sandbox Code Playgroud)

我会像这样发送:

using (var client = new HttpClient())
{
    var response = await client.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在发布之前计算请求有效负载的大小(以字节为单位)?我问的原因是因为我将把这个请求提交给第 3 方 API,我知道如果它超过预定的最大大小,API 将拒绝我的请求。我想如果我可以计算请求中有效负载的大小,我可以避免发布超过此最大大小的请求。

c# json

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

使用新的 csproj 格式时如何将 C# 程序集标记为符合 CLS?

我最近将一个 C# 项目从xproj格式升级到了新的csproj. 在迁移过程中,旧的AssemblyInfo.cs已被删除,所以我想知道如何表明我的库符合 cls 标准?

仅供参考:这是 AssemblyInfo.cs 中的属性: [assembly:CLSCompliant(true)]

.net c# projects-and-solutions visual-studio

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