Ответ 1
var iweilCopy = sil.Select(item => new InvoiceWithEntryInfo()
{
IdWEI = item.Id,
NameWEI = item.Name,
....
}).ToList();
У меня есть 2 класса, которые имеют некоторые одинаковые свойства. Я помещаю в свойства списка из 1-го класса, и после этого я хочу взять некоторые необходимые свойства и поместить их в список типа 2-го класса. Я сделал последовательность каста через С#, и она работает нормально, но я должен делать с LINQ. Я пытался что-то сделать, но без хороших результатов. Помогите мне с предложениями.
1-й класс:
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 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;
}
}
Образец С#, который работает нормально: ...
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();
Вам нужна функция для преобразования экземпляра T
в экземпляр U
:
ResultType ConvertMethod(StartType input)
и вам нужно написать это. Тогда
outputList = inputList.Select(ConvertMethod).ToList();
применит его ко всей коллекции ввода. Функция преобразования может быть встроенной в lambda, но не обязательно (если функция имеет правильную подпись, например ConvertMethod
, тогда компилятор будет ее правильно преобразовывать, чтобы перейти к Select
).
Просто используйте Select:
if(sil != null)
{
var iweil = sil.Select(item=>new InvoiceWithEntryInfo()
{
IdIWEI = item.ID,
AmountIWEI = item.Amount,
DateIWEI = item.Date
}).ToList();
}
Ваш обычный код С# и LINQ не эквивалентны. В регулярном С# вы создаете экземпляр нового экземпляра другого класса и инициализируете свойства, в то время как вы пытаетесь использовать (преобразовывать) из одного в другое; однако, поскольку они не находятся в той же иерархии классов, которую вы не можете использовать, и поскольку вы не определили оператор преобразования, вы также не можете преобразовать (используя синтаксис букв).
Вам либо нужно определить оператор преобразования
public static explicit operator InvoiceWithEntryInfo(ServiceInfo item){
return new InvoiceWithEntryInfo {
IdIWEI = item.ID,
AmountIWEI = item.Amount,
DateIWEI = item.Date};
}
или метод создания с использованием обычной сигнатуры метода. Я бы предложил последнего, так как бывший притворился чем-то не таким. Это не актерский состав, и я лично хотел бы видеть, что код создает новый экземпляр на основе некоторого ввода.