VB.NET相当于这个C#linq类

Ice*_*ind 1 c# linq vb.net ienumerable

伙计们,我正在尝试将某些东西从C#转换为VB.NET,而我在查找VB.NET与C#的yield关键字方面存在差异.我意识到'yield'不是VB.NET的可转换关键字,所以有人可以告诉我如何在VB.NET中实现这个代码.除了实现的GetEnumerator()函数之外,我将其全部转换过来.它只是一个实现CollectionBase和IEnumerable的类(使LINQ值得):

[Serializable()]
public partial class Customers : CollectionBase,    System.Collections.Generic.IEnumerable<BusinessLayer.Customer> 
{

    public new System.Collections.Generic.IEnumerator<BusinessLayer.Customer> GetEnumerator()
    {
        foreach (BusinessLayer.Customer Cust in this.List)
        {
            yield return Cust;
        }
    }

    public Customers()
    {

    }

    public Customers(DataRowCollection datarows) : this()
    {
        this.Load(datarows);
    }
    protected void Load(DataRowCollection dataRows)
{
    foreach (DataRow dr in dataRows) {
        this.Add(new Customer(dr));
    }
}

public Customer this[int index] {
    get { return (Customer)base.InnerList[index]; }
    set { base.InnerList[index] = value; }
}

public int Add(Customer val)
{
    return base.InnerList.Add(val);
}
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

adr*_*nks 5

由于您无法使用该yield关键字,因此您必须采用GetEnumerator()其他方式.你可以做的是返回Listfrom 的枚举器CollectionBase.但是,因为这是一个IList而不是一个IList<T>,你必须强制转换它(你可以使用Cast<T>()Linq 的扩展方法).然后你的C#代码变为:

public IEnumerator<BusinessLayer.Customer> GetEnumerator()
{
    return InnerList.Cast<BusinessLayer.Customer>().GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果,但行为略有不同(关于不再使用延迟执行yield).

在VB.Net中,GetEnumerator()将是:

Public Function GetEnumerator() As IEnumerator(Of BusinessLayer.Customer)
    Return InnerList.Cast(Of BusinessLayer.Customer)().GetEnumerator()
End Function
Run Code Online (Sandbox Code Playgroud)

其余代码应直接转换为VB.Net.