如何声明by-reference参数变量以在Linq查询中使用?

Sha*_*ica 0 c# linq parameters

我有MyClass一个方法的类:

public bool MyMethod(out DateTime? MyDate) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想以下列方式调用此方法:

var q = from mc in MyClasses.AsEnumerable()
        from output in mc.MyMethod(out dt) // how to declare dt?
        select new { mc, output, dt };
Run Code Online (Sandbox Code Playgroud)

显然这不编译,因为我没有声明dt.我可以在查询之外声明它,但这并没有给我一种温暖的模糊感:(a)我不喜欢在大于必要范围的级别声明变量,并且(b)它不是立即和直观的显而易见的是,将为查询中的每一行正确计算该值.

是否有一些语法允许我DateTime? dt在查询中声明?

Tim*_*vis 6

这里不仅仅是dt的范围,你的MyMethod()需要返回一个枚举,让SelectMany工作(第二个来自子句)

不确定你想要在这里实现什么,但我倾向于让你的函数返回一个包含bool和日期的结构或类,并通过let语句分配它......就像...

var qry = from mc in MyClasses.FunctThatReturnsAnIEnumerable()
          let result = mc.MyMethod() //this returns the struct
          select new {mc, result.BoolVal, result.DateVal};
Run Code Online (Sandbox Code Playgroud)


Mar*_*arc 5

我的第一个想法是"ew"(这就是我的代码闻到了噪音).我觉得你真的试图强迫使用那种不属于它的方法.

我的下一个想法是简单地创建你想要的行为,也许是这样的东西(虽然我仍然不建议这是一个很好的解决方案):

public DateTime? GetMyDate() 
{
   DateTime? dt;
   MyMethod(out dt);
   return dt;
}
Run Code Online (Sandbox Code Playgroud)

然后...

var q = from mc in MyClasses.AsEnumerable()
        select new { mc, output, Date = GetMyDate() };
Run Code Online (Sandbox Code Playgroud)

我假设从MyDate返回的bool在这种情况下并不重要,这真的打破了意图.我只假设因为,考虑到你想要的结果,你似乎也不关心布尔回归.

在任何一种情况下,我都建议重新考虑这一点,而不是用你所拥有的东西来弥补.