小编AXM*_*MIM的帖子

确保延迟执行只执行一次或其他

我遇到了一个奇怪的问题,我想知道我应该怎么做.

我有这个返回a的类,IEnumerable<MyClass>它是一个延迟执行.现在,有两个可能的消费者.其中一个对结果进行排序.

请参阅以下示例:

public class SomeClass
{
    public IEnumerable<MyClass> GetMyStuff(Param givenParam)
    {
        double culmulativeSum = 0;
        return myStuff.Where(...)
                      .OrderBy(...)
                      .TakeWhile( o => 
                      {
                          bool returnValue = culmulativeSum  < givenParam.Maximum;
                          culmulativeSum += o.SomeNumericValue;
                          return returnValue; 
                      };
    }
}
Run Code Online (Sandbox Code Playgroud)

消费者只调用延迟执行一次,但是如果他们要调用它多,那么结果将是错误的,因为culmulativeSum不会重置.我通过单元测试无意中发现了这个问题.

解决问题的最简单方法.ToArray()是以一点点开销为代价添加和删除延迟执行.

我还可以在消费者类中添加单元测试,以确保它们只调用一次,但这不会阻止将来编码这个潜在问题的新消费者.

我想到的另一件事是进行后续执行.就像是

return myStuff.Where(...)
       .OrderBy(...)
       .TakeWhile(...)
       .ThrowIfExecutedMoreThan(1);
Run Code Online (Sandbox Code Playgroud)

显然这不存在.实现这样的事情是一个好主意,你会怎么做?

否则,如果有一只我看不到的大粉红色大象,那么指出它将会受到赞赏.(我觉得有一个,因为这个问题是关于一个非常基本的场景:|)

编辑:

这是一个糟糕的消费者使用示例:

public class ConsumerClass
{
    public void WhatEverMethod()
    {
        SomeClass some = new SomeClass();
        var stuffs = some.GetMyStuff(param);
        var nb = stuffs.Count(); //first deferred execution …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda deferred-execution

10
推荐指数
3
解决办法
395
查看次数

C#中是否有等效的SQL NULLIF函数?

C#中是否内置等效的SQL NULLIF函数?

可能看起来像的示例:

double? result
double denominator = 0;
double Numerator = 100;
result = Numerator / NullIf(denominator, 0);
result = Numerator / denominator.NullIf(0);
result = Numerator / Object.NullIf(denominator, 0);
Run Code Online (Sandbox Code Playgroud)

.net c# null nullif

4
推荐指数
2
解决办法
3986
查看次数

淘汰如何获得$ parent的$ parent

<div id="root" data-bind="with: $data.Building">
    <div data-bind="foreach: $data.Offices">
        <div data-bind="foreach: $data.desks">
            <div data-bind="foreach: $data.Legs">
                <button class="btnDestroyDeskLeg"> Destroy</button>
            </div>
        </div>
    </div>
</div>
<script>
        $("#root").on('click', '.btnDestroyDeskLeg', function ()
        {
            var context = ko.contextFor(this),
                Office = ** ? **,
                Desk = context.$parent,
                Leg = context.$data;
        });
</script>
Run Code Online (Sandbox Code Playgroud)

如何获得$ Parent的$ Parent?换句话说,什么应取代"**?**"才能上任?

jquery knockout.js

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

有条件的 buildnumber 以便发布预发布的 nuget 包?

我正在自动化 nuget 包的部署。
它工作正常,只是我无法按照我想要的方式设置 prelease 包。

有两个分支触发构建。
当构建由 master 分支触发时,我想发布一个常规的 nuget 包。
当测试分支触发构建时,我想发布一个预发布包。

为了做到这一点,我需要添加-beta到 nuget 包版本号。所以我把Automatic package versioningfromuse build number改为use an environment variable.
请参阅以下 img : 在此处输入图片说明

起初它抱怨变量说No value was found for the provided environment variable,但我通过删除$(). 但是现在我仍然卡住了,因为我找不到用Build.BuilderNumberand设置变量的方法-beta。我可以复制构建并让每个构建触发器用于自己的分支,但我宁愿只有一个构建可以处理来自两个分支的构建

所以现在我正在考虑将设置use build number更改回并更改在构建选项卡options中设置构建编号的表达式。但是,即使在那里我也无法使用条件表达式Build.SourceBranch来添加或不添加-beta.
Chris McKenzie 似乎在这里遇到了类似的问题并用 powershell 解决了它。不幸的是,我不知道 powershell 并且无法理解,因为脚本对于我需要的来说似乎太大了。我仍然相信他们对 powershell …

azure-devops azure-pipelines

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

Progress4gl 如何锁定自己?

在单元测试中,我需要验证程序在处理表时是否跳过锁定的记录。我一直无法设置锁定记录,因为测试无法锁定自己,这很有意义。

这是我试图实现的目标的示例。

  DEV VAR v_isCommitted        AS LOGI NO-UNDO.
  DEF VAR hl                   AS HANDLE   NO-UNDO.
  DEF BUFFER bufl              FOR tablename. 
  hl = BUFFER bufl:HANDLE. 

  LOCKED_RECORDS:
  DO TRANSACTION ON ERROR UNDO, LEAVE LOCKED_RECORDS:
      /*Setup : Create record not committed yet*/
      CREATE tablename.
      ASSIGN tablename.fields = fieldsvalue.



      /*ACT :  Code I'm trying to test*/   
      /*...some code...*/  
      v_isCommitted = hl:FIND-BY-ROWID(ROWID(tablename), EXCLUSIVE-LOCK, NO-WAIT)
                                AND AVAILABLE(bufl) 
                                AND NOT LOCKED(bufl).
      /*...some code touching the record if it is commited...*/   

      /*ASSERT :  program left new record tablename AS …
Run Code Online (Sandbox Code Playgroud)

progress-4gl openedge

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

在linq中是否有一个愚蠢的"全部"评估所有元素?

就像操作符"&"将执行第二个条件,即使第一个条件为假,我也在为"全部"寻找相同的东西.我想要"全部"的结果,但也希望评估每个元素.在我的例子中,我称之为愚蠢.

这是我想要这个的一个例子.

main
{
   Object[] array = InitSomeArray();
   AreObjectValid = array.dumbAll(o => Validate(o));
   //other stuff with AreObjectValid 
}

private bool Validate(object o)
{
    bool IsValid = IsPositiveNumeric(o.ToString());
    HighLighInvalidObjectWhenInvalid(o, IsInvalid: !IsValid);
    return IsValid;   
}
Run Code Online (Sandbox Code Playgroud)

linq中是否存在这样的事情?
注意:我已经知道如何处理这个没有链接.

c# linq

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

MOQ如果方法设置相交会发生什么?

如果您愿意,当两个设置相交或重叠时会发生什么.

例如,在下面的场景中,设置重叠,因为显然"aSpecificString"也被视为任何字符串.

Interface ISomeInterface
{
    int SomeMethod(string param);
}

[TestMethod]
public void SomeClass_ShouldBehaveProperly_GivenSomeScenario()
{
    var mock = new Mock<ISomeInterface>(MockBehavior.Strict);
    mock.Setup(m => m.SomeMethod("aSpecificString"))
        .Returns(100);
    mock.Setup(m => m.SomeMethod(It.IsAny<string>()))
        .Returns(0);

    /*the rest of the test*/
}
Run Code Online (Sandbox Code Playgroud)

我想知道它相交时会发生什么.

它会抛出异常还是无法检测到重叠并按照添加顺序使用第一个匹配设置?

我认为最好避免重叠设置.

c# unit-testing moq

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

如何在缓冲区句柄中使用`export`?

在删除表之前导出表的数据就像一个超级按钮一样。
范例:

OUTPUT TO VALUE("C:\mytable.d") APPEND.
EXPORT mybd.mytable.
OUTPUT CLOSE. 
DELETE mybd.mytable.
Run Code Online (Sandbox Code Playgroud)

但是,我还没有使它在使用缓冲区句柄时起作用。以下内容将导出一个整数,而不是删除的数据。

DEF INPUT PARAM hlTableToDelete AS HANDLE NO-UNDO.
...
OUTPUT TO VALUE("C:\" + hiTableToDelete:NAME + ".d") APPEND.
EXPORT hlTableToDelete:HANDLE.
OUTPUT CLOSE. 
hlTableToDelete:BUFFER-DELETE().
Run Code Online (Sandbox Code Playgroud)

命令运行export并实际导出缓冲区句柄的数据需要哪种语法?

progress-4gl openedge

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