繁体   English   中英

使用 LINQ 将 List 转换<u>为 List</u><t></t>

[英]Using LINQ to convert List<U> to List<T>

我有 2 个具有一些相同属性的类。 我从第一个 class 中存入一个列表属性,然后,我想获取一些需要的属性并将它们放入第二个 class 类型的列表中。 我已经通过 C# 制作了演员序列,并且运行正常,但我必须使用 LINQ。 我试图做一些事情,但没有好的结果。 请帮助我提出建议。

第一个 Class:

   public class ServiceInfo {
    private long _id;
    public long ID {
        get { return this._id; }
        set { _id = value; }
    }

    private string _name;
    public string Name {
        get { return this._name; }
        set { _name = value; }
    }

    private long _qty;
    public long Quantity {
        get { return this._qty; }
        set { _qty = value; }
    }

    private double _amount;
    public double Amount {
        get { return this._amount; }
        set { _amount = value; }
    }

    private string _currency;
    public string Currency {
        get { return this._currency; }
        set { _currency = value; }
    }

    private DateTime? _date;
    public DateTime? Date {
        get { return this._date; }
        set { _date = value; }
    }
}

第二个 Class:

class InvoiceWithEntryInfo {
    private string currencyField;

    private long IdField;
    public long IdIWEI {
        get { return this.IdField; }
        set { IdIWEI = value; }
    }

    private string nameField;
    public string NameIWEI {
        get { return this.nameField; }
        set { NameIWEI = value; }
    }

    private long qtyField;
    public long QuantityIWEI {
        get { return this.qtyField; }
        set { QuantityIWEI = value; }
    }

    private double amountField;
    public double AmountIWEI {
        get { return this.amountField; }
        set { AmountIWEI = value; }
    }
    
    private DateTime dateField;
    public DateTime? DateIWEI {
        get { return this.dateField; }
        set { DateIWEI = value; }
    }

    public string OwnerIWEI {
        get; set;
    }
}

C# 样本运行正常:...

var sil = new List<ServiceInfo>();
var iweil = new List<InvoiceWithEntryInfo>();

...

if (sil != null)
    {
        foreach (ServiceInfo item in sil)
        {
            iweil.Add(new InvoiceWithEntryInfo
                {
                    IdIWEI = item.ID,
                    AmountIWEI = item.Amount,
                    DateIWEI = item.Date
                });
        }

运行不正常的 LINQ 示例:

iweilCOPY = sil.ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a);

iweilCOPY = sil.FindAll(a => (sil is InvoiceWithEntryInfo)).ConvertAll<InvoiceWithEntryInfo>(a => (InvoiceWithEntryInfo)a);
var iweilCopy = sil.Select(item => new InvoiceWithEntryInfo()
{
  IdWEI = item.Id,
  NameWEI = item.Name,
  ....
}).ToList();
  var iweil = sil.Select(item=> new InvoiceWithEntryInfo {
                 IdIWEI = item.ID,
                 AmountIWEI = item.Amount,
                 DateIWEI = item.Date}).ToList();

您需要 function 将T实例转换为U实例:

ResultType ConvertMethod(StartType input)

你需要写这个。 然后

outputList = inputList.Select(ConvertMethod).ToList();

将其应用于整个输入集合。 The conversion function can be a lambda written inline but doesn't need to be (if the function has the right signature, like ConvertMethod then the compiler will convert it correctly to pass to Select ).

只需使用 Select:

if(sil != null)
{
   var iweil = sil.Select(item=>new InvoiceWithEntryInfo()
            {
                IdIWEI = item.ID,
                AmountIWEI = item.Amount,
                DateIWEI = item.Date
            }).ToList();
}

您的常规 C# 代码和 LINQ 不等效。 在常规 C# 中,您实例化另一个 class 的新实例并初始化属性,而您尝试从一个转换(以及转换)另一个; 但是,由于它们不在同一个 class 层次结构中,因此您无法转换,并且由于您尚未定义转换运算符,因此您也无法转换(使用转换语法)。

您要么必须定义一个转换运算符

public static explicit operator InvoiceWithEntryInfo(ServiceInfo item){
     return new InvoiceWithEntryInfo {
             IdIWEI = item.ID,
             AmountIWEI = item.Amount,
             DateIWEI = item.Date};
 }

或使用常规方法签名的创建方法。 我建议后者,因为前者假装不是。 这不是演员表,我个人希望能够看到代码根据一些输入创建一个新实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM