簡體   English   中英

C# 無法將類轉換為 IEnumerable

[英]C# cannot convert class to IEnumerable

我正在嘗試將我的類轉換為 IEnumerable 對象。

我的班級是:

public class StageTwo : IEnumerable
{
    public string Party { get; set; }
    public string Currency { get; set; }
    public string DrCr { get; set; }
    public string Account { get; set; }
    public double? Amount { get; set; }

    public IEnumerator GetEnumerator()
    {
        return GetEnumerator();
    }
}

下面我有一個方法,我查詢一些數據並將其成功放入我的 StageTwo 對象中。 然后我想復制大部分數據並更改-item.Amount

 public IEnumerable<StageTwo> Stage2Entries()
        {
            var queryJoin = (from inn in db.Input.Take(1)
                             join y in db.InputY on inn.YAction equals y.YAction
                             orderby inn.Id descending
                             select new StageTwo
                             {
                                 Id = inn.Id,
                                 Party = inn.XParty,
                                 Currency = inn.Curr,
                                 DrCr = y.DrAccount1,
                                 Account = y.YAction,
                                 Amount = inn.Amount
                             });
/*WORKS FINE ABOVE*/

            StageTwo stageTwoFinal = new StageTwo();
            foreach (var item in queryJoin)
            {
                stageTwoFinal.Id = item.Id;
                stageTwoFinal.Party = item.Party;
                stageTwoFinal.Currency = item.Currency;
                stageTwoFinal.DrCr = item.DrCr;
                stageTwoFinal.Account = item.Account;
                stageTwoFinal.Amount = item.Amount;

                stageTwoFinal.Id = item.Id;
                stageTwoFinal.Party = item.Party;
                stageTwoFinal.Currency = item.Currency;
                stageTwoFinal.DrCr = item.DrCr;
                stageTwoFinal.Account = item.Account;
                stageTwoFinal.Amount = -item.Amount;
            }
/*Unable to convert here*/
            var collection = (IEnumerable<StageTwo>)stageTwoFinal;
            return stageTwoFinal;
        }

我收到System.InvalidCastException

如何將此類轉換為 IEnumerable?

如果你想返回查詢結果只需寫:

return queryJoin.ToList()

這將執行查詢並將結果作為列表返回。 您只需要:

public IEnumerable<StageTwo> Stage2Entries()
{
    var queryJoin = (from inn in db.Input.Take(1)
                         join y in db.InputY on inn.YAction equals y.YAction
                         orderby inn.Id descending
                         select new StageTwo
                         {
                             Id = inn.Id,
                             Party = inn.XParty,
                             Currency = inn.Curr,
                             DrCr = y.DrAccount1,
                             Account = y.YAction,
                             Amount = inn.Amount
                         });
    return queryJoin.ToList();
}

IEnumerable<T>是所有集合實現的接口。 StageTwo代表一個單一的對象,所以它實現IEnumerable<T>沒有任何意義

如果您使用 EF/EF Core,則可以使用ToListAsync()異步(即無阻塞)執行查詢:

public async Task<IEnumerable<StageTwo>> Stage2Entries()
{
    ...
    var list=await queryJoin.ToListAsync();
    return list;
}

您不需要實現IEnumerable或其通用版本IEnumerable<T>即可將類的元素放入集合中。 話雖如此,您可能不想實現該接口:

public class StageTwo
{
    public string Party { get; set; }
    public string Currency { get; set; }
    public string DrCr { get; set; }
    public string Account { get; set; }
    public double? Amount { get; set; }
}

換句話說,您的StageTwo集合。 相反,它們只是集合中的元素

現在您可以在查詢中創建該類的實例並返回該查詢:

var queryJoin = (from inn in db.Input.Take(1)
                         join y in db.InputY on inn.YAction equals y.YAction
                         orderby inn.Id descending
                         select new StageTwo
                         {
                             Id = inn.Id,
                             Party = inn.XParty,
                             Currency = inn.Curr,
                             DrCr = y.DrAccount1,
                             Account = y.YAction,
                             Amount = inn.Amount
                         });
return queryJoin;

你看你根本不需要所有的循環和轉換,因為queryJoin已經一個IEnumerable<StageTwo>

請注意,查詢是延遲執行的,這意味着它會在您迭代元素時運行(例如,通過使用foreachToList )。 因此,您不會立即看到該查詢的結果,您必須明確地執行該查詢。 有關這方面的解釋,請參閱C#中的延遲執行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM