C#方法Linq变量返回
希望您的帮助:) 我搜索以使LinQ变量bellow“ES”的结果在另一种方法中可用C#方法Linq变量返回,c#,linq,variables,methods,C#,Linq,Variables,Methods,希望您的帮助:) 我搜索以使LinQ变量bellow“ES”的结果在另一种方法中可用 public void Contract_ES(QCAlgorithm Algorithm_ES, Slice slice) { foreach(var chain in slice.FutureChains) { var ES = (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
public void Contract_ES(QCAlgorithm Algorithm_ES, Slice slice)
{
foreach(var chain in slice.FutureChains)
{
var ES = (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Algorithm_ES.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
}
}
我尝试创建一个接口,然后使用该方法,结果是: 使用QuantConnect.证券
namespace Quant
{
public interface IFuturesContractSelector_ES
{
void GetFuturesContract_ES(QCAlgorithm Algorithm_ES, Slice slice);
}
}
public class Contract_ES : IFuturesContractSelector_ES
{
private readonly Slice _Slice;
private readonly QCAlgorithm _Algorithm_ES;
public Contract_ES(QCAlgorithm Algorithm_ES)
{
_Algorithm_ES = Algorithm_ES;
}
public Contract_ES(Slice slice)
{
_Slice = slice;
}
public void GetFuturesContract_ES(QCAlgorithm Algorithm_ES, Slice slice)
{
foreach(var chain in slice.FutureChains)
{
if (chain.Value.Symbol.StartsWith("ES"))
{
var ES = (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Algorithm_ES.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
}
}
return ES;
}
}
在返回ES的行中,我得到以下错误:
当前上下文中不存在名称“ES”
奇怪,因为我有另一个方法是这样构建的,没有问题-_-
可能是使用foreach语句导致不可能返回“var ES” 我下载了QuantConnect,只是想知道你想做什么。下面的示例至少不会产生任何错误,但我还没有尝试输出
using QuantConnect.Data;
using System.Linq;
using QuantConnect.Data.Market;
namespace QuantConnect.Algorithm
{
public interface IFuturesContractSelector_ES
{
FuturesContract GetFuturesContract_ES(QCAlgorithm Algorithm_ES, Slice slice);
}
public class Contract_ES : IFuturesContractSelector_ES
{
private readonly Slice _Slice;
private readonly QCAlgorithm _Algorithm_ES;
public Contract_ES(QCAlgorithm Algorithm_ES)
{
_Algorithm_ES = Algorithm_ES;
}
public Contract_ES(Slice slice)
{
_Slice = slice;
}
public FuturesContract GetFuturesContract_ES(QCAlgorithm Algorithm_ES, Slice slice)
{
foreach (var chain in slice.FutureChains)
{
if (chain.Value.Symbol.Value.StartsWith("ES"))
{
return (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Algorithm_ES.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
}
}
return null;
}
}
}
或者您可以对Slice类进行扩展:
using QuantConnect.Data;
using System.Linq;
using QuantConnect.Data.Market;
namespace QuantConnect.Algorithm
{
public static class SliceExtensions
{
public static FuturesContract GetFuturesContract_ES(this Slice slice, QCAlgorithm Algorithm_ES)
{
foreach (var chain in slice.FutureChains)
{
if (chain.Value.Symbol.Value.StartsWith("ES"))
{
return (from futuresContract in chain.Value.OrderBy(x => x.Expiry)
where futuresContract.Expiry > Algorithm_ES.Time.Date.AddDays(1)
select futuresContract).FirstOrDefault();
}
}
return null;
}
}
public class Test
{
public void TestMyMethod(Slice slice)
{
var contract = slice.GetFuturesContract_ES(new QCAlgorithm());
//... do something
}
}
}
不清楚你想要什么。您的变量将被计算多次。如果您想以某种方式从这个方法返回它们,您可以创建一个列表并返回该列表,或者以可枚举的形式返回。这取决于你想做什么。你在if语句(var ES=(..)中声明ES,你需要在foreach上面声明它才能工作。即使我这样做,foreach语句也是一样的。同样,你的GetFuturesContract_ES方法是无效的,但你正在尝试返回一个契约。您需要更改方法的返回类型。这是您所期望的吗?如果您将鼠标悬停在var ES上,它会显示什么类型?该类型应该是您的方法的返回类型,在界面中也是如此。您好,非常感谢您直接在平台上进行检查,如果您不知道该网站,我很高兴向您发现它!;)您的解决方案可以很好地在具有Slice参数的其他方法中实现变量ES,现在我不想在没有Slice参数的方法中引入它。我该怎么做?我很高兴这对你有用。你能进一步解释下一个问题是什么意思吗?它在未来连锁店吗?