web-dev-qa-db-ja.com

LINQを使用してList <U>をList <T>に変換する

いくつかの同一のプロパティを持つ2つのクラスがあります。私は、1番目のクラスのリストプロパティにストックし、その後、いくつかの必要なプロパティを取得して、それらを2番目のクラスタイプのリストに入れたいと思います。私はC#を介してキャストシーケンスを作成しましたが、それは正常に実行されますが、LINQを使用する必要があります。私は何かを試みましたが、良い結果は得られませんでした。提案をお願いします。

ファーストクラス:

   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;
    }
}

OKを実行する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);
45
mihai
var iweilCopy = sil.Select(item => new InvoiceWithEntryInfo()
{
  IdWEI = item.Id,
  NameWEI = item.Name,
  ....
}).ToList();
74
vc 74
  var iweil = sil.Select(item=> new InvoiceWithEntryInfo {
                 IdIWEI = item.ID,
                 AmountIWEI = item.Amount,
                 DateIWEI = item.Date}).ToList();
11
Bob Vale

TインスタンスをUインスタンスに変換する関数が必要です:

ResultType ConvertMethod(StartType input)

これを書く必要があります。それから

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

入力コレクション全体に適用されます。変換関数は、インラインで記述されたラムダにすることができますが、そうである必要はありません(関数にConvertMethodのような正しいシグネチャがある場合、コンパイラはSelectに渡すように正しく変換します)。

10
Richard

選択を使用するだけです:

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

通常のC#コードとLINQは同等ではありません。通常のC#では、他のクラスの新しいインスタンスをインスタンス化し、プロパティを初期化しますが、一方から他方へのキャスト(十分な変換)を試みます。ただし、これらはキャストできない同じクラス階層にないため、変換演算子を定義していないため、(キャスト構文を使用して)変換することもできません。

変換演算子を定義する必要があります

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

または、通常のメソッドシグネチャを使用した作成メソッド。前者はそうではないふりをするので、後者をお勧めします。それはキャストではなく、個人的にはコードが何らかの入力に基づいて新しいインスタンスを作成することを確認したいと思います。

2
Rune FS