linqの助けを借りて順次自動生成されたID
-
22-07-2019 - |
質問
クラスの予約があります
public class Booking
{
public int Id { get; set; }
public string From { get; set; }
public string To { get; set; }
}
linqの助けを借りて予約リストを作成し、「Id」プロパティを自動生成して1ずつインクリメントするメカニズムが必要です
つまりリストの予約に10個の予約オブジェクトが含まれている場合、最初のオブジェクトのId = 1、2番目のId = 2などです...
提案
解決
以下は、IDプロパティにインデックスが投影された新しい予約のリストです。おそらくこれに似た何かをして、インデックスで既存のリストを更新することができます...
var myBookings = myExistingListOfTen.Select((b, index) => new Booking
{
Id = index + 1,
From=b.From,
To=b.To
});
他のヒント
良くありませんが、動作します。秘Theは、アイテムのインデックスを提供するオーバーロードを使用することです。
list = list.Select((item, index) => { item.Id = index; return item; });
これにより既存の予約が更新されますが、IDが設定された新しいインスタンスを選択し、Scott Iveyが示唆するように予約を複製して参照を失うという犠牲を払ってこのthisい return
を避けることもできます。もちろん、1ベースのIDが必要な場合は追加する必要があります。
この方法でIDを生成することも少し奇妙ですが、IDなしで新しい予約のリストを取得して生成したい場合は、許容できる解決策かもしれません。この場合、IDは明らかに0または1で始まるのではなく、既に割り当てられている最大のIDに1を加えたものでなければなりません。
確かに、オブジェクトのプロパティである場合、呼び出しごとに値を一致させる必要があります。予約 'A'は、リスト内のどこに存在するかに応じて異なるIDを持つことはできません。リスト内のアイテムのインデックスだけが必要な場合は、アイテムのプロパティとして保存せず、リスト内の位置から取得します。
public class Booking
{
private static int BookingCount = 1;
public Booking()
{
Id = BookingCount++;
}
public int Id { get; set; }
public string From { get; set; }
public string To { get; set; }
}
あなたの質問を正しく理解しているかどうかはわかりませんが、いつでもできます
ID = bookings.Select(b=>b.ID).Max()+1;
それがそのような良いアイデアかどうかはわかりません(それは非常に優れたパフォーマンスにはなりません)。
@tvanfosson(+1)には同意しますが、 Booking
で ID
を本当に保持したい場合は、Bookingの構築時に設定する必要があると思います。各コンテキストがシリアルIDで予約を作成する予約コンテキストのようなものがあります:
public class Booking
{
protected Booking() { }
public int Id { get; set; }
public string From { get; set; }
public string To { get; set; }
}
public class BookingContextFactory
{
private int count;
public BookingContextFactory() : this(0) { }
public BookingContextFactory(int startValue)
{
count = startValue;
}
public Booking CreateBooking(string from, string to)
{
return new InternalBooking { Id = count++, From = from, To = to };
}
private class InternalBooking : Booking
{
public InternalBooking() : base() { }
}
}