C#方法Linq变量返回

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)

希望您的帮助:)

我搜索以使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)
              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参数的方法中引入它。我该怎么做?我很高兴这对你有用。你能进一步解释下一个问题是什么意思吗?它在未来连锁店吗?